TreeViewItemがTextboxのような入力コントロールの場合、SelectedItemChangedイベントとSelectedItemプロパティは発生しません。次のサンプルコードは、TreeView SelectedItemChangedイベントにブレークポイントを配置することによって問題を示しています。このブレークポイントは "文字列ヘッダー"ではなく、 "文字列ヘッダー"が選択されたときに発生します。TreeView TextBoxのSelectedItemの動作
テキストボックスまたはリッチテキストボックス(私の実際のアプリケーション)が重要なバブリングイベントを食べているとします。 LabelのようなコントロールのようにTextBoxのために動作するTreeView SelectedItemを取得するにはどうすればよいですか?
注:この問題を解決できる場合は、MVVMとMEFを使用しているため、SelectedItemに双方向バインドする必要があります。 SelectedItemは読み込み専用ですが、これは問題です(http://silverscratch.blogspot.com/2010/11/two-way-binding-on-treeviewselecteditem.html)。私はこの関連リンクが誰かを助けるかもしれないと思った。
XAML:背後に
<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeViewItem>
<TreeViewItem.Header>
<TextBox>
Textbox Header
</TextBox>
</TreeViewItem.Header>
</TreeViewItem>
<TreeViewItem>
<TreeViewItem.Header>
String Header
</TreeViewItem.Header>
</TreeViewItem>
</TreeView>
コード:
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
// Breakpoint will fire when "String Header" Selected
// !!! Breakpoint does not fire when Textbox Selected
var newValue = e.NewValue;
var oldValue = e.OldValue;
}
おかげで、
私は恐怖です。私のTreeViewの実際のテキストボックスTreeViewItemsはMEFによって第三者アセンブリから来ます。長い話をすると、私はTreeViewのイベントを処理する必要があります。しかし、私はTreeViewレベルでこのバブルGotFocusイベントを処理する必要があると思いますか? – aidesigner
もちろん、GotFocus = "UIElement_OnGotFocus"をTreeViewに移動しても機能します。しかし、このチェックをハンドラに追加することを忘れないでください:item!= null(私は答えを更新しました) – asktomsk
素晴らしいです!もし私がしたら、私は質問を閉じる必要があります。 1)理解のために、SelectedItemChangedがTextBoxではなくLabelなどのTreeViewItemsコンテンツに対して自動的に動作する理由を知っていますか?存在しないバブリングイベントは何ですか? 2)リンクされたGetParentObjectメソッドでは、最後の手段はVisualTreeHelperを使用することです。親を見つけるためにVisualTreeHelperを使用するだけでは不十分なのはなぜですか? – aidesigner