2012-03-07 70 views
1

在WPF编程中,我写了一个按钮单击事件处理程序的问题。由于按钮位于列表框项目(数据模板的一部分)内,并且单击该按钮时,我无法确定它属于哪个项目。有没有解决方法? SOS - -如何识别所点击的按钮属于哪个列表框项目?

+0

取决于你捍卫一个通用的点击处理程序的列表框的附加事件?或者你有每个ListboxItem点击事件处理程序?无论如何,如果发件人对象或RoutedEventArgs中的Source属性应该是您单击的项目。 – dowhilefor 2012-03-07 12:42:54

+0

如果您提供一些代码或解释您如何执行此操作,我们可以更好地为您提供帮助。 – 2012-03-07 12:46:45

回答

0

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

扩增要求

+0

对不起,我不明白你的话?你能更详细地解释一下吗? – 2012-03-07 12:37:58

+0

他的意思是,Listbox,你的孩子被点击的地方,也因为点击一个子项目而改变SelectedIndex和SelectedItem属性。您可以使用这些属性查看哪个项目被点击。 – dowhilefor 2012-03-07 12:44:02

9

似乎已经绑定列表框的集合,和你的按钮是你的数据的一部分模板或项目模板。
您可以将按钮的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属性,你可以更好地控制你想要访问的事件处理函数。

有很多方法可以做所有事情!选择最适合你的那个。

+0

thx为您的解释和代码,我已经解决了我的问题。 – 2012-03-07 12:59:24

+0

顺便说一下,标签属性一般是关于什么的? – 2012-03-07 13:06:34

+0

它用于在控件中存储一些自定义用户数据。 WPF和WindowsForms的所有控件都具有此属性。顺便说一句,按钮的DataContext属性已经指向完全相同的对象。 – 2012-03-07 13:14:13

3

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