WPF后台代码如何使用AlternationIndex?点击按钮获取项索引
解决WPF ItemControl按钮点击获取项索引的问题
方法1:利用AlternationIndex绑定到按钮Tag
既然你已经了解AlternationIndex,可以直接把它绑定到按钮的Tag属性,点击时读取Tag就能拿到对应索引:
XAML代码:
<ItemsControl x:Name="MyItemsControl" ItemsSource="{Binding MyItems}" AlternationCount="{Binding MyItems.Count}"> <ItemsControl.ItemTemplate> <DataTemplate> <Button Content="点击查看索引" Tag="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ContentPresenter}}" Click="Button_Click"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
C#后台代码:
private void Button_Click(object sender, RoutedEventArgs e) { if (sender is Button btn && btn.Tag is int index) { MessageBox.Show($"当前项索引:{index}"); } }
注意要把AlternationCount设为集合的总数量,保证每个项的索引对应准确。
方法2:通过DataContext从数据源查找索引
如果不想依赖AlternationIndex,可以通过按钮的DataContext获取当前项,再从绑定集合中查找索引:
XAML代码:
<ItemsControl ItemsSource="{Binding MyItems}"> <ItemsControl.ItemTemplate> <DataTemplate> <Button Content="点击查看索引" Click="Button_Click"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
C#后台代码:
private void Button_Click(object sender, RoutedEventArgs e) { if (sender is Button btn && btn.DataContext is MyItemModel item) { int index = MyItems.IndexOf(item); MessageBox.Show($"当前项索引:{index}"); } }
这种方法要求你的集合是ObservableCollection<T>或支持IndexOf方法的类型。
方法3:MVVM模式下用命令传递索引
如果是MVVM架构,可以通过CommandParameter把索引传递给命令:
XAML代码:
<ItemsControl ItemsSource="{Binding MyItems}" AlternationCount="{Binding MyItems.Count}"> <ItemsControl.ItemTemplate> <DataTemplate> <Button Content="点击查看索引" Command="{Binding DataContext.ViewIndexCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}" CommandParameter="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ContentPresenter}}"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
ViewModel代码:
public ICommand ViewIndexCommand { get; } public YourViewModel() { ViewIndexCommand = new RelayCommand<int>(index => { MessageBox.Show($"当前项索引:{index}"); }); }
这里的RelayCommand可以自己实现,也可以使用Prism等框架提供的实现。
内容的提问来源于stack exchange,提问作者Shammy Nurgeldi
相关产品推荐
相关产品推荐

