2009-04-19 6 views
8

私はListBoxを持っています、それはObservableCollectionに縛られています。DataTemplatesを使用したWPF ListBoxItems - DataTemplate内からListBoxItemにバインドされたCLRオブジェクトを参照するにはどうすればよいですか?

ListBoxItemは、DataTemplateと表示されます。 DataTemplateにボタンがあります。ボタンをクリックすると、ObservableCollectionのメンバーへの参照が必要になります。これはDataTemplateの一部です。ボタンをクリックするとアイテムが選択されないので、ListBox.SelectedItemプロパティは使用できません。

いずれか:マウスを動かしたとき、またはボタンをクリックしたときに正しくListBox.SelectedItemを設定する方法を理解する必要があります。または、ボタンが属するListBoxItemにバインドされたCLRオブジェクトへの参照を取得する別の方法を理解する必要があります。 2番目のオプションはきれいだと思われますが、いずれにしてもOKです。以下

簡体字のコードセグメント:

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

をし、あなたのコードビハインド、あなたのButtonDataContextDataContextはあなたのDataTemplateに等しいです "。この場合は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自体ではありません。 –

3

あなたは何をする必要があるかによって、いくつかの可能性があります。

まず、主な質問は「なぜこれが必要ですか」です。ほとんどの場合、コンテナアイテムへの参照は実際には使用されません(これはあなたのケースではありませんが、詳しく説明してください)。あなたがリストボックスをデータバインディングしている場合、それはまれです。

リストボックスの名前がMyListBoxの場合、myListBox.ItemContainerGenerator.ContainerFromItem()を使用してリストボックスからアイテムを取得できます。

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

あなたは一例this blogを見つけることができます:(XXXがあなたのタイプのデータ・バインドデータがどこにあるか)、送信者パラメータからは、例えば、通過テンプレートた現品を取り戻すことができます。彼女はインデックスメソッドを使用しますが、Itemメソッドは似ています。

+0

元々言われたような質問に対する良い答え。ベンドウィーは、私が言ったことを私が意味しなかったと正しく推測しましたが、これもまた感謝しています。投票した。 –

関連する問題