Как определить, к какой нажатой кнопке принадлежит какой элемент списка? - PullRequest
1 голос
/ 07 марта 2012

В программировании WPF у меня есть проблема, чтобы написать обработчик события нажатия кнопки. Поскольку кнопка находится внутри элемента списка (часть таблицы данных), и когда кнопка нажата, я не могу сказать, к какому элементу она принадлежит. Есть ли решение? SOS - -

Ответы [ 3 ]

9 голосов
/ 07 марта 2012

Похоже, что вы связали список со списком, и ваши кнопки являются частью вашего шаблона данных или шаблона элемента.
Вы можете привязать свойство Tag кнопок к вашему объекту данных:

<DataTemplate DataType="{x:Type c:Person}">
    <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
            <TextBlock>Name:</TextBlock>
            <TextBlock Text="{Binding Path=Name}"/>
        </StackPanel>
        <Button Click="Button_Click" Tag="{Binding Path=.}">Click me!</Button>
    </StackPanel>
</DataTemplate>

И событие щелчка:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button b = (Button)sender;
    Person p = (Person)b.Tag;
    MessageBox.Show(p.Name);
}

Но, как предлагают другие люди, вы можете использовать свойство DataContext кнопки.В моем примере он уже указывает на объект Person.

Я думаю, что используя свойство Tag, вы получаете больше контроля над тем, что вы хотите получить в своем обработчике событий.

Есть много способов сделать все!Выберите тот, который подходит вам больше всего.

3 голосов
/ 07 марта 2012

Вы можете получить эту информацию от DataContext.

public class Person {

    public string Name { get; set; }
    public int Age { get; set; }

}

 Persons = new ObservableCollection<Person>() {

      new Person() { Name = "John", Age = 30 },
      new Person() { Name = "Tim", Age = 48 }
 };

 lbPersons.DataContext = Persons;

 private void person_Clicked(object sender, RoutedEventArgs e) {

        Button cmd = (Button)sender;
        if (cmd.DataContext is Person) {
            Person p = (Person)cmd.DataContext;
        }
    }

И в XAML:

<Window.Resources>
    <DataTemplate x:Key="UserTemplate" >
        <StackPanel Orientation="Horizontal" >
            <TextBlock Text="{Binding Path=Name}" Width="50"/>
            <TextBlock Text="{Binding Path=Age}" Width="20"/>
            <Button Content="Click" Click="person_Clicked"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ListBox IsSynchronizedWithCurrentItem="True" Name="lbPersons" ItemsSource="{Binding}" ItemTemplate="{StaticResource UserTemplate}" />
</Grid>
0 голосов
/ 07 марта 2012

ListBox.selectedItem и listbox.SelectedIndex будут установлены как часть нажатия кнопки.

Предполагается, что элементы в списке имеют тип MyListBoxItem

void SomeButtonClick(Object sender, EventArgs e)
{
  ListBox lb = sender as ListBox
  if (lb != null)
  {
    MyListBoxItem item = lb.SelectedItem As MyListBoxItem;
    if (item != Null)
    {
      item.MethodRelatedToButton(); // maybe
    }
  }
}

Усиливается по запросу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...