2009-04-19 32 views
8

我有一个ListBox,这是绑定到ObservableCollection带DataTemplates的WPF ListBoxItems - 如何从DataTemplate中引用CLR对象绑定到ListBoxItem?

每个ListBoxItem会显示一个DataTemplate。我的DataTemplate中有一个按钮,点击时需要参考ObservableCollection的成员,它是DataTemplate的一部分。我无法使用ListBox.SelectedItem属性,因为单击该按钮时该项目未被选中。

所以要么:我需要弄清楚当鼠标悬停或点击按钮时,如何正确设置ListBox.SelectedItem。或者我需要找出另一种方法来获取对按钮所属的ListBoxItem绑定的CLR对象的引用。第二种选择似乎更清洁,但无论哪种方式都可能。

简化代码如下段:

XAML:

<DataTemplate x:Key="postBody"> 
    <Grid> 
     <TextBlock Text="{Binding Path=author}"/> 
     <Button Click="DeleteButton_Click">Delete</Button> 
    </Grid> 
</DataTemplate> 

<ListBox ItemTemplate="{StaticResource postBody}"/> 

C#:

private void DeleteButton_Click(object sender, RoutedEventArgs e) 
{ 
    Console.WriteLine("Where mah ListBoxItem?"); 
} 

回答

11

一般来说人们会感兴趣的,直接绑定到ListBoxItem,而不是实际的CLR对象ListBoxItem。如果你有文章列表例如,你可以使用现有的模板:

<DataTemplate x:Key="postBody" TargetType="{x:Type Post}"> 
    <Grid> 
    <TextBlock Text="{Binding Path=author}"/> 
    <Button Click="DeleteButton_Click">Delete</Button> 
    </Grid> 
</DataTemplate> 
<ListBox ItemTemplate="{StaticResource postBody}" 
    ItemSource="{Binding Posts}"/> 

,并在您的代码隐藏,你ButtonDataContext等于你DataTemplateDataContext。在这种情况下,一个Post

private void DeleteButton_Click(object sender, RoutedEventArgs e){ 
    var post = ((Button)sender).DataContext as Post; 
    if (post == null) 
    throw new InvalidOperationException("Invalid DataContext"); 

    Console.WriteLine(post.author); 
} 
+0

这是完美的,你也设法修复我的问题的措辞。我会编辑它,因为你是对的,我对绑定的CLR对象感兴趣,而不是ListBoxItem本身。 – 2009-04-19 20:19:59

3

根据你需要做什么,你有几种可能性。

首先,主要问题是:“你为什么需要这个”?大多数情况下,没有真正使用容器物品的参考(并不是说这是你的情况,但你应该详细说明)。如果你正在绑定你的列表框,那么很少有这种情况。

其次,如果您的列表框名为MyListBox,您可以使用myListBox.ItemContainerGenerator.ContainerFromItem()从列表框中获取该项目。从发件人参数,你可以找回那种通过模板实际的项目,例如(其中XXX是数据绑定的数据类型的你):

Container = sender as FrameworkElement; 
if(sender != null) 
{ 
    MyItem = Container.DataContext as XXX; 
    MyElement = MyListBox.ItemContainerGenerator.ContainerFromItem(MyItem); // <-- this is your ListboxItem. 
} 

你可以找到一个例子的this blog。她使用索引方法,但Item方法类似。

+0

原来措辞的问题的答案很好。 bendewey正确地认为我不是说我所说的我所做的,但这也是表示赞赏。投了票。 – 2009-04-19 21:37:22