2012-03-25 2 views
3

TreeViewItem이 텍스트 상자와 같은 입력 컨트롤 인 경우 TreeView의 SelectedItemChanged 이벤트 및 SelectedItem 속성이 발생하지 않습니다. 아래 예제 코드는 TreeView SelectedItemChanged 이벤트에 중단 점을 배치하여 문제를 보여줍니다. 이 중단 점은 "문자열 머리글"은 선택되지만 "텍스트 상자 머리글"은 선택되지 않으면 실행됩니다.TreeView 하위 항목이있는 TreeView SelectedItem 동작

필자는 Textbox 또는 RichTextbox (내 실제 응용 프로그램)가 중요한 버블 링 이벤트를 먹고 있다고 가정합니다. TextBox에 대해 TreeView SelectedItem이 Label과 같은 컨트롤처럼 동작하도록하려면 어떻게해야합니까?

참고 :이 문제를 해결할 수 있다면 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> 

코드 뒤에 : 당신은 당신의 TreeViewGotFocus 이벤트를 캐치 할 필요

답변

1

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 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를 통해 제 3 자 어셈블리에서 가져온 것입니다. 긴 이야기를 짧게 나는 TreeView에서 이벤트를 처리해야합니다. 그러나 TreeView 수준에서이 버블 링 GotFocus 이벤트를 처리 할 수 ​​/해야한다고 생각합니까? – aidesigner

+0

GotFocus = "UIElement_OnGotFocus"를 TreeView로 옮기더라도 작동합니다. 그러나이 체크를 핸들러에 추가하는 것을 잊지 마십시오 : item! = null (답변을 업데이트했습니다) – asktomsk

+0

굉장했습니다! 제가 할 수있는 한 질문을 마감해야합니다. 1) 이해를 돕기 위해 SelectedItemChanged가 TextBox가 아닌 Label과 같은 TreeViewItems 컨텐츠에 대해 자동으로 작동하는 이유를 알고 있습니까? 버블 링 이벤트가 없습니다. 2) 연결된 GetParentObject 메서드에서 최후의 수단은 VisualTreeHelper를 사용하는 것입니다. 부모를 찾기 위해 VisualTreeHelper를 사용하는 것만으로는 충분하지 않은 이유는 무엇입니까? – aidesigner