在包含按钮的ListView中,如何获取所单击的索引?

时间:2011-12-05 11:04:39

标签: wpf listview button

我有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 谁能告诉我如何获得点击按钮的索引?

3 个答案:

答案 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);
}