我有ListView
只包含按钮。我想要做的很简单,我想要点击按钮的索引。列表的计数从0到100不等,因此当用户点击按钮6时,我需要这个号码进行处理。
我这样定义了ListView
:
<ListView Name="myListView"
ItemsSource="{Binding Source={StaticResource myDataModel},
Path=StatusList,
Mode=OneWay}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<Button Mode=OneWay}"
Click="Button_Click"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我最初的想法是创建一个带ID的自定义按钮,并将索引绑定到ID,但我无法弄清楚如何做到这一点。
我试过了:
int a = myListView.Items.IndexOf(((Button)sender));
在事件处理程序中,但它总是返回0xffffffff 谁能告诉我如何获得点击按钮的索引?
答案 0 :(得分:26)
使用DataContext查找项目:
var item = (sender as FrameworkElement).DataContext;
int index = myListView.Items.IndexOf(item);
答案 1 :(得分:2)
这应该有效:
使用ItemsControl交换ListView并将AlternationCount设置为一个非常高的数字(高于列表中的最大计数元素)。 发出命令并将当前索引作为参数传递。
<强> XAML:强>
<Window.CommandBindings>
<CommandBinding
Command="Select"
Executed="Click_Executed" />
</Window.CommandBindings>
<ItemsControl AlternationCount="9999" Name="myListView"
ItemsSource="{Binding Source={StaticResource myDataModel},
Path=StatusList,
Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="Select"
CommandParameter="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource TemplatedParent}}"
Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(ItemsControl.AlternationIndex)}" Width="200" Height="20" Click="Button_Click"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
代码背后:
private void Click_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("Index: " + e.Parameter.ToString());
}
答案 2 :(得分:0)
这可以工作:
private void Button_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
MyDataModelElementClass myDataModelElementClass = (MyDataModelElementClass)button.BindingContext;
var index = myDataModel.IndexOf(myDataModelElementClass);
}