В ListView, содержащем кнопки, как получить индекс нажатой? - PullRequest
5 голосов
/ 05 декабря 2011

У меня есть 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>

Моя первоначальная идея состояла в том, чтобы создать пользовательскую кнопку с идентификатором и привязать индекс к идентификатору, но я не могу понять, как это сделать.

Я пытался:

int a = myListView.Items.IndexOf(((Button)sender)); 

внутри обработчика событий, но он всегда возвращает 0xffffffff, может кто-нибудь сказать мне, как получить индекс нажатой кнопки?

Ответы [ 2 ]

27 голосов
/ 05 декабря 2011

Используйте DataContext, чтобы найти элемент:

var item = (sender as FrameworkElement).DataContext;
int index = myListView.Items.IndexOf(item);
2 голосов
/ 05 декабря 2011

Это должно работать:

Поменяйте местами свой 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>

Код сзади:

private void Click_Executed(object sender, ExecutedRoutedEventArgs e)
{
  MessageBox.Show("Index: " + e.Parameter.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...