2009-05-07 3 views
2

TreeView 컨트롤을 사용하여 내 응용 프로그램에서 탐색을 구현하기 위해 프레젠테이션 모델을 사용하고 있습니다. TreeViewItem의 IsSelected 속성이 양방향 바인딩을 통해 내 뷰 모델에 바인딩되어 있습니다. 하위 노드가 선택되면 해당 노드의 첫 번째 하위 노드가 클릭 된 하위 노드로 선택됩니다. TreeViewItem이 내 프레젠테이션 모델에서 IsSelected 속성을 설정할 때 속성 변경 이벤트를 수신하지 않는 것 같습니다. 첫 번째 자식 노드가 선택되었지만 부모 노드는 선택을 취소하지 않습니다. 여기 내 프레젠테이션 모델의 코드가 있습니다.WPF TreeView 부모가 선택 될 때 첫 번째 자식을 선택하려는 경우

public bool IsSelected { 
    get { 
     return this._isSelected; 
    } 
    set { 
     if(this._isSelected != value) { 
      this._isSelected = value; 
      if(this.Nodes.Count > 0) { 
       this._isSelected = false; 
       this.Nodes[0].IsSelected = true; 
      } 
      this.NotifyPropertyChanged("IsSelected"); 
     } 
    } 
} 

그리고 여기 내 TreeViewItem의 스타일입니다 :

<Style TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
</Style> 

답변

1
나는 매우 비슷한 문제를 가지고 있었고, 나는 코드로 아이를 선택하면 내가 TreeViewItem에 포커스를하는 것이 필요 발견

래퍼 (wrapper)를 사용하여 부모 노드가 "UnSelect"라고 부르는 것입니다.

Private Sub TreeViewItem_Selected(ByVal sender As System.Object, ByVal e As RoutedEventArgs) 
      If CType(sender, TreeViewItem) IsNot Nothing Then 
       CType(sender, TreeViewItem).Focus() 
       e.Handled = True 
      End If 
End Sub 
+0

이렇게했습니다. treeviewitem 내에서 usercontrol을 선택할 때 awilinsk과 같은 문제가있었습니다. 사용자 정의 컨트롤은 수동으로 일부 요소에 초점을 맞추고 있으며 이중 선택 문제를 일으켰습니다. 고마워, 나는 그것에 너무 많은 시간을 보냈다. – kimphamg

1

은 또 다른 가능성을 고려 :

<EventSetter Event="TreeViewItem.Selected" 
        Handler="TreeViewItem_Selected" 
         /> 

그리고 부분 클래스 : 그래서 XAML에서 나는 이벤트 처리기를 추가

트 리뷰 확신이 두 TreeViewItems 불가능하다을 시도 트리에서 한 번에 선택할 수 있으므로이를 방지해야합니다. 아마도 TreeView의 버그이지만 TreeView를 사용하는 방식에 문제가 될 수도 있습니다.

효율성을 위해 TreeView는 TreeViewItem을 발견하는 방법에 대해 매우 까다로 웠습니다. 이 알고리즘은 효율적입니다이 (증분 방식으로 수행) : 트 리뷰 내 항목 컨테이너 사이

  1. 봐 더 트 리뷰에 대한 그 트 리뷰 개체 '항목 컨테이너들
  2. 봐 더 때까지
  3. 3 단계를 반복 오브젝트없는 객체 더 많은 TreeView 객체가 발견되었습니다.

이 때문에 TreeViewItem의 각 레벨이 이전 레벨 바로 아래에있는 경우에만 TreeView는 자손을 찾을 수 있습니다.

예를 들어,이 작동합니다 :

<TreeView> 
    <TreeViewItem> 
    <TreeViewItem /> 
    </TreeViewItem> 
    ... 
</TreeView> 

을 그렇게 것이 :

<HierarchicalDataTemplate TargetType="{x:Type MyItemType"} ItemsSource="{Binding subItems}"> 
    ... 
</HierarchicalDataTemplate> 

<TreeView ItemsSource="{Binding items}" /> 

비 TreeViewItems이 같은 개재하는 경우 그러나 그것은 작동하지 않습니다

<TreeView> 
    <TreeViewItem> 
    <Border> 
     <TreeViewItem/> 
    </Border> 
    </TreeViewItem> 
</TreeView> 

또는이 :

<TreeView> 
    <DockPanel> 
    <TreeViewItem> 
     <TreeViewItem/> 
    </TreeViewItem> 
    </DockPanel> 
</TreeView> 

이 마지막 두 경우는 잘 표시되지만 TreeView는 TreeViewItems를 보지 않으므로 선택 코드가 비활성화됩니다. 이것은 당신이 묘사하는 증상을 일으킬 것입니다.

본인의 상황인지 아닌지는 잘 모르겠지만, 다만이를 위해 언급해야한다고 생각했습니다.

관련 문제