2009-07-16 8 views
4

リストボックスにはいくつかのテキストブロックとボタンがあります。現在選択されているリストボックスアイテムを渡すメソッドを呼び出すのはボタンのコードの後ろです。問題は、アイテムを選択して別のアイテムのボタンをクリックしたときに、 "SelectedItem"プロパティが更新されないということです。XamlまたはC#ボタンをクリックして親ListBoxItemを選択する方法がありますか?WPFリストボックスボタン選択されたアイテム

XAML

<DataTemplate> 
    <Grid> 
     <Button x:Name="myButton" Click="myButton_Click" Height="30" Width="30"> 
      <Image Source="Resources\Image.png" /> 
     </Button> 
     <TextBlock Text="{Binding DataField}"></TextBlock> 
    </Grid> 
</DataTemplate> 
+0

だから、ボタンや各ListBoxItemのためのTextBlockがありますか? XAMLを投稿したり、これがどのように設定されているかを少し考えてください。 – Charlie

答えて

19
var curItem = ((ListBoxItem)myListBox.ContainerFromElement((Button)sender)).Content; 
+0

簡単にするために答えとして選択しました。 – Nate

+0

これは、送信者の要素の範囲で動作します!それを(グリッド)送信者に使用しました。 – Enrico

+0

素晴らしい答えは、ContainerFromElement関数については決して知らなかったでしょう – antfx

3

、ボタンがクリックされたとき、それは停止するルーティングイベントトラバーサルを引き起こし、trueにe.Handledを設定します。

ルーティングされたイベントを再度発生させるハンドラをButtonに追加するか、ListBoxItem型のビジュアル祖先を見つけてそのIsSelectedプロパティをtrueに設定することができます。

EDIT

このような拡張メソッド:

public static DependencyObject FindVisualAncestor(this DependencyObject wpfObject, Predicate<DependencyObject> condition) 
{ 
    while (wpfObject != null) 
    { 
     if (condition(wpfObject)) 
     { 
      return wpfObject; 
     } 

     wpfObject = VisualTreeHelper.GetParent(wpfObject); 
    } 

    return null; 
} 

使用法:

myButton.FindVisualAncestor((o) => o.GetType() == typeof(ListBoxItem)) 
+0

このような方法はどのように見えますか?ボタンがオンになっているListBoxItemの視覚的な祖先をどのように見つけることができますか? – Nate

+1

私の答えを編集しました。 –

関連する問題