2012-03-25 13 views
3

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; 
    } 

おかげで、

答えて

1

あなたのTreeViewGotFocusイベントをキャッチする必要があります

<TreeView SelectedItemChanged="TreeView_SelectedItemChanged" 
      GotFocus="UIElement_OnGotFocus"> 
    <TreeViewItem> 
     <TreeViewItem.Header> 
      <TextBox>Textbox Header</TextBox> 
     </TreeViewItem.Header> 
    </TreeViewItem> 
    <TreeViewItem> 
     <TreeViewItem.Header>String Header</TreeViewItem.Header> 
    </TreeViewItem> 
</TreeView> 

private void UIElement_OnGotFocus(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem item = UIHelpers.TryFindParent<TreeViewItem> 
          ((DependencyObject) e.OriginalSource); 
    if (item != null) 
      item.IsSelected = true; 
} 

TryFindParentの実装については、こちらをご覧ください:
https://stackoverflow.com/a/4838168/1088908

+0

私は恐怖です。私のTreeViewの実際のテキストボックスTreeViewItemsはMEFによって第三者アセンブリから来ます。長い話をすると、私はTreeViewのイベントを処理する必要があります。しかし、私はTreeViewレベルでこのバブルGotFocusイベントを処理する必要があると思いますか? – aidesigner

+0

もちろん、GotFocus = "UIElement_OnGotFocus"をTreeViewに移動しても機能します。しかし、このチェックをハンドラに追加することを忘れないでください:item!= null(私は答えを更新しました) – asktomsk

+0

素晴らしいです!もし私がしたら、私は質問を閉じる必要があります。 1)理解のために、SelectedItemChangedがTextBoxではなくLabelなどのTreeViewItemsコンテンツに対して自動的に動作する理由を知っていますか?存在しないバブリングイベントは何ですか? 2)リンクされたGetParentObjectメソッドでは、最後の手段はVisualTreeHelperを使用することです。親を見つけるためにVisualTreeHelperを使用するだけでは不十分なのはなぜですか? – aidesigner

関連する問題