2009-04-19 34 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