9

にバインドされた ListBox がありObservableCollectionます。

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

ListBox.SelectedItemしたがって、マウスがホバーしたとき、またはボタンがクリックされたときに適切に設定する方法を理解する必要があります。ListBoxItemまたは、ボタンが属する にバインドされた CLR オブジェクトへの参照を取得する別の方法を見つける必要があります。2 番目のオプションの方がすっきりしているように見えますが、おそらくどちらの方法でも問題ありません。

以下の簡略化されたコード セグメント:

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?");
}
4

2 に答える 2

12

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

そして、コードビハインドでは、Button'sは' sDataContextと同じです。この場合、。DataTemplateDataContextPost

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);
}
于 2009-04-19T20:13:39.077 に答える
3

何をする必要があるかに応じて、いくつかの可能性があります。

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

myListBox.ItemContainerGenerator.ContainerFromItem()次に、リストボックスの名前がである場合、を使用してリストボックスからアイテムを取得できますMyListBox。送信者パラメーターから、たとえば(XXXデータバインドされたデータのタイプはどこにありますか) 、テンプレート化された実際のアイテムを取得できます。

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

このブログの例を見つけることができます。彼女はindexメソッドを使用していますが、Itemメソッドも同様です。

于 2009-04-19T20:22:14.967 に答える