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

C# 如何识别单击的按钮属于哪个列表框项目?,c#,wpf,C#,Wpf,在WPF编程中,我在编写按钮单击事件处理程序时遇到了一个问题。因为该按钮位于listbox项(datatemplate的一部分)内,当单击该按钮时,我无法判断它属于哪个项。有什么解决办法吗?SOS---ListBox.selectedItem和ListBox.SelectedIndex将作为单击按钮的一部分进行设置 假设列表框中的项目为MyListBoxItem类型 void SomeButtonClick(Object sender, EventArgs e) { ListBox lb =

在WPF编程中,我在编写按钮单击事件处理程序时遇到了一个问题。因为该按钮位于listbox项(datatemplate的一部分)内,当单击该按钮时,我无法判断它属于哪个项。有什么解决办法吗?SOS---

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

按要求放大

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

按要求放大

您似乎已将列表框绑定到集合,并且您的按钮是数据模板或项目模板的一部分。
您可以将按钮的
标记
属性绑定到数据对象:

<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>
但是,正如其他人所建议的,您可以使用按钮的
DataContext
属性。在我的示例中,它已经指向
Person
对象

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


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

似乎您已将列表框绑定到集合,并且您的按钮是数据模板或项目模板的一部分。
您可以将按钮的
标记
属性绑定到数据对象:

<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>
但是,正如其他人所建议的,您可以使用按钮的
DataContext
属性。在我的示例中,它已经指向
Person
对象

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


做任何事都有很多方法!选择最适合您的信息。

您可以从
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;
        }
    }
公共类人物{
公共字符串名称{get;set;}
公共整数{get;set;}
}
人员=新观察到的集合(){
新人(){Name=“John”,年龄=30},
新人(){Name=“Tim”,年龄=48}
};
lbPersons.DataContext=人;
已单击的私有无效人员(对象发送者,路由目标){
按钮cmd=(按钮)发送器;
if(cmd.DataContext为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>

您可以从
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;
        }
    }
公共类人物{
公共字符串名称{get;set;}
公共整数{get;set;}
}
人员=新观察到的集合(){
新人(){Name=“John”,年龄=30},
新人(){Name=“Tim”,年龄=48}
};
lbPersons.DataContext=人;
已单击的私有无效人员(对象发送者,路由目标){
按钮cmd=(按钮)发送器;
if(cmd.DataContext为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>


对不起,我听不懂你的话?你能更详细地解释一下吗?他的意思是,你的一个孩子被点击的列表框也会因为点击一个子项而改变SelectedIndex和SelectedItem属性。您可以使用这些属性查看单击了哪个项目。对不起,我听不懂您的话?你能更详细地解释一下吗?他的意思是,你的一个孩子被点击的列表框也会因为点击一个子项而改变SelectedIndex和SelectedItem属性。您可以使用这些属性查看单击了哪个项目。根据具体情况,您是否将常规单击处理程序作为列表框上的附加事件进行了辩护?或者在每个ListboxItem上都有一个click事件处理程序?无论如何,如果发件人对象或RoutedEventArgs中的源属性应该是您的clicked项,我们可以更好地帮助您,如果您提供一些代码或解释您是如何执行此操作的。根据情况,您是否将通用Click处理程序作为列表框上的附加事件进行辩护?或者在每个ListboxItem上都有一个click事件处理程序?无论如何,如果发件人对象或RoutedEventArgs中的源属性应该是您单击的项目。如果您提供一些代码或解释如何执行此操作,我们可以更好地帮助您。谢谢您的解释和代码,我已经解决了我的问题。顺便说一下,标签属性通常是关于什么的?它用于在控件中存储一些自定义用户数据。WPF和WindowsForms的所有控件都具有此属性。顺便说一句,按钮的DataContext属性已经指向完全相同的object.thx进行解释和编码,我已经解决了我的问题。顺便问一下,tag属性通常是关于什么的?它用于在控件中存储一些自定义用户数据。WPF和WindowsForms的所有控件都具有此属性。顺便说一下,按钮的DataContext属性已经指向完全相同的对象。