自动对象的绑定事件处理程序

时间:2012-02-28 02:34:11

标签: c# windows-phone-7 binding

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

这是我的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绑定在一起。知道怎么做吗? =)

2 个答案:

答案 0 :(得分:1)

基于你的代码结构,我会回答假设你没有使用MVVM之类的东西,但是我肯定会推荐Silverlight开发的模式。

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

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

</ListBox>

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

<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();
}

答案 1 :(得分:1)

在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事件连接事件处理程序。在你的Command(或事件处理程序)中,获取SelectedItem,并查看第一个属性(你没有告诉我们它被调用了什么,所以我不知道该怎么称呼它。)

请记住在执行任何操作之前确保SelectedItem不为null,并且当您完成处理命令后,将 SelectedIndex 设置为-1,以便他们可以选择相同的项目两次,仍然可以获得执行的功能。