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

pee*_*eer 5 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>
Run Code Online (Sandbox Code Playgroud)

我最初的想法是创建一个带ID的自定义按钮,并将索引绑定到ID,但我无法弄清楚如何做到这一点.

我试过了:

int a = myListView.Items.IndexOf(((Button)sender)); 
Run Code Online (Sandbox Code Playgroud)

在事件处理程序内部,但它总是返回0xffffffff任何人都可以告诉我如何获取单击按钮的索引?

Bas*_*Bas 27

使用DataContext查找项目:

var item = (sender as FrameworkElement).DataContext;
int index = myListView.Items.IndexOf(item);
Run Code Online (Sandbox Code Playgroud)


Sve*_*enG 2

这应该有效:

将 ListView 与 ItemsControl 交换并将 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>
Run Code Online (Sandbox Code Playgroud)

背后代码:

private void Click_Executed(object sender, ExecutedRoutedEventArgs e)
{
  MessageBox.Show("Index: " + e.Parameter.ToString());
}
Run Code Online (Sandbox Code Playgroud)