将事件处理程序绑定到自定义对象

本文关键字:自定义 对象 绑定 事件处理 程序 | 更新日期: 2023-09-27 18:25:56

如何将事件处理程序绑定到我创建的自定义对象?

这是我的XAML

 <ListBox x:Name="ListData">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Margin="0,0,0,30">
                                    <Image VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding Path=TileImage}" Width="175" Height="175" />
                                    <TextBlock  Margin="5" Width="200" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left" Text="{Binding Path=TileName}" FontSize="25"/>
                                </StackPanel>
                            </DataTemplate>            
                        </ListBox.ItemTemplate>
                    </ListBox>

背后的代码

    // Create collection
    ImageTiles = new ObservableCollection<ImageTile>();
    // Create each object in the collection
    ImageTile RSS= new ImageTile("RSS", "/Images/Hard.jpg");
    ImageTile test= new ImageTile("test", "/Images/Hard.jpg");
    ImageTile Exam= new ImageTile("Exam", "/Images/Hard.jpg");
    ImageTile Settings = new ImageTile("Settings", "/Images/Hard.jpg");
    ImageTiles.Add(RSS);
    ImageTiles.Add(test);
    ImageTiles.Add(Exam);
    ImageTiles.Add(Settings);
    this.ListData.ItemsSource = ImageTiles;

我想将事件处理程序与每个ImageTile绑定在一起。知道怎么做吗

将事件处理程序绑定到自定义对象

根据您的代码结构,我会假设您没有使用MVVM或类似的东西来回答,但我绝对建议Silverlight开发使用这种模式。

然而,您的数据源绑定将类似于:

<ListBox x:Name="ListData" ItemsSource="{Binding ImageTiles}">
</ListBox>

您可以在代码隐藏中创建一个通用的单击处理程序,并将Image的单击事件分配给该处理程序。

<ImageButton VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding Path=TileImage}" Width="175" Height="175" Click="imageButton_Click" />

然后,您可以在对象上设置一个方法,负责重定向到特定图像平铺的任何必要位置。然后在您的代码后面的处理程序将类似于:

private void imageButton_Click(object sender, RoutedEventArgs e)
{
    var imageTile = ((ImageButton)sender).DataContext as ImageTile;
    imageTile.RedirectSomewhere();
}

在ViewModel中,添加一个属性以捕获所选项目(例如)

private ImageTile _selectedItem;
public ImageTile SelectedItem
{
     get {return _selectedItem;}
     set
     {
         if(value != _selectedItem)
         { 
              _selectedItem = value;
              RaisePropertyChanged("SelectedItem");
         }
     }
}

然后,在XAML中,绑定SelectedItem:

<ListBox ItemsSource="{Binding ImageTiles}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
</ListBox>

使用MVVM Light(或其他方式)将SelectionChanged事件绑定到命令,或为SelectionChanged事件连接事件处理程序。在您的命令(或事件处理程序)中,获取SelectedItem,然后查看第一个属性(您没有告诉我们它的名称,所以我不知道该叫什么)。

在执行任何操作之前,请记住确保SelectedItem不为null,并且在处理完命令后,将SelectedIndex设置为-1,这样他们就可以两次选择同一项,并且仍然可以执行功能。