如何识别单击的按钮属于哪个列表框项目

本文关键字:属于 列表 项目 按钮 何识别 识别 单击 | 更新日期: 2023-09-27 18:27:12

在WPF编程中,我在编写按钮单击事件处理程序时遇到问题。因为按钮在列表框项目(数据模板的一部分)中,当点击按钮时,我无法判断它属于哪个项目。有解决方案吗?SOS-

如何识别单击的按钮属于哪个列表框项目

似乎已经将列表框绑定到集合,并且按钮是数据模板或项目模板的一部分
您可以将按钮的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);
}

但是,正如其他人建议的那样,您可以使用Button的DataContext属性。在我的示例中,它已经指向Person对象。

我认为通过使用Tag属性,您可以更好地控制事件处理程序中要访问的内容。

做任何事情都有很多方法!选择最适合你的。

您可以从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>

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
    }
  }
}

按要求放大