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