2011-08-12 2 views
2

내가이 같은 3 레벨의 데이터 바인딩 된 WPF 트 리뷰를 가지고 말 :특정 수준의 WPF TreeView에 어떻게 바인딩 할 수 있습니까?

    • AA
      • AAA를
      • BBB
      • CCC
  • b,515,
    • AA BB
      • AAA
  • C
    • AA
      • AAA
    • BB
    • CC
      • AAA
      • BBB
      • CCC

여기서 선택된 노드 bbbccc이다. TreeView 외부에있는 일부 컨트롤에서 cc이라는 말을 묶는 방법이 있습니까?

UPDATE이 구문을 사용하여 목록 상자에서 선택한 항목에 결합 할 수있는 방법에 비슷한 일이다 나는 여기 얻으려고

:

<TextBox Text="{Binding Path=VM.Definitions/term}" /> 

을 어디옵니다 ItemsSource는 VM.Definitions 및 ListBox에 바인딩됩니다. IsSynchronizedWithCurrentItem은 True로 설정됩니다. 내가 범위가 비슷한 HierarchicalDataTemplates와 TreeView의 특정 수준에 바인딩하는 방법이 있는지 알아 내려고하고있어.

내가 H.B.을 받아 : 나는 IT에게 작업을했다 방법

답을 찾았지만, Tim Murphy의 대답을 조합하여 "빛을 보게"했습니다.너는 (AFAIK) ListBox의 단일 레벨에 바인딩 할 수있는 것처럼 TreeView의 레벨에 바인딩 할 수 없다. 실제로는 할 수 있지만 특정 레벨은 바인딩 할 수 없다.

그래서 내가해야 할 일은 선택 사항이 변경 될 때마다 TreeView의 각 레벨에서 선택되는 모든 것이 나의 VM에 연결된다는 것입니다. 예를 들어 Customer, Order, OrderItem의 세 가지 수준이있는 TreeView가 있다고 가정 해보십시오. SelectedItemChanged에서 VM의 각 레벨을 다시 설정합니다.

선택한 항목이 고객 인 경우 VM.SelectedCustomer가 고객으로 설정되고 VM.SelectedOrder 및 VM.SelectedOrderItem이 null로 설정됩니다. 선택한 항목이 Order 인 경우 VM.SelectedCustomer를 선택한 항목의 상위 항목으로 설정하고 VM.SelectedOrder를 선택한 항목으로 설정하고 VM.SelectedOrderItem을 null로 설정합니다. 등등.

빠른 예 (나의 실제 코드, 단지 개념을 시연하기 위해) :

void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    if (treeViewLesson.SelectedItem == null) { 
     VM.SelectedOrderItem = null; 
     VM.SelectedOrder = null; 
     VM.SelectedCustomer = null; 
    } 
    else if (treeViewLesson.SelectedItem is Customer) { 
     VM.SelectedOrderItem = null; 
     VM.SelectedOrder = null; 
     VM.SelectedCustomer = treeViewLesson.SelectedItem as Customer; 
    } 
    else if (treeViewLesson.SelectedItem is Order) { 
     VM.SelectedOrderItem = null; 
     VM.SelectedOrder = treeViewLesson.SelectedItem as Order; 
     VM.SelectedCustomer = VM.SelectedOrder.ParentCustomer; 
    } 
    else if (treeViewLesson.SelectedItem is OrderItem) { 
     VM.SelectedOrderItem = treeViewLesson.SelectedItem as OrderItem; 
     VM.SelectedOrder = VM.SelectedOrderItem.ParentOrder; 
     VM.SelectedCustomer = VM.SelectedOrder.ParentCustomer; 
    } 
} 
+0

당신이 MVVM 패턴을 사용하고 있습니까? 어떤 언어로 읽기가 편리합니까? –

+0

저는 MVVM 패턴을 주로 따르고 있습니다. "코드 숨김"은 C# –

답변

2

편집 : 행동의이 종류는 상당히 복잡하고 도구 TreeView에 당신이 정확히 스릴 수 없습니다 수 있습니다. 슬프게도 나는 이것에 대한 완전한 답을 줄 수는 없지만 단지 몇 가지 지침 만 제공합니다.

  • 귀하의 VM은 현재 수준에서 선택의 경로에있는 항목을 반환하는 CurrentItem 특성, 궁극적으로 선택한 항목을 포함하는 subbranch을 소유 즉 항목에 노출 될 수 있습니다.
  • 위 방향 탐색은이 경우에 매우 유용 할 것이라고 생각합니다. 따라서 Parent을 갖는 것이 좋은 아이디어 일 수 있습니다. 예 : 선택된 항목이 변경 될 경우, 나무를 올라가 각각 CurrentItem 속성을 변경할 수 있습니다 (다음 오히려 나쁠 수/잘못된 예제 코드)

    private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
        var oldItem = e.OldValue as TreeViewModel; 
        // "Deselect" old branch 
        var parent = oldItem.Parent; 
        while (parent != null) 
        { 
         parent.CurrentItem = null; 
         parent = parent.Parent; 
        } 
        // "Select" new branch 
        var newItem = e.NewValue as TreeViewModel; 
        parent = newItem.Parent; 
        while (parent != null) 
        { 
         parent.CurrentItem = newItem; 
         newItem = parent; 
         parent = parent.Parent; 
        } 
    } 
    
  • 바인딩은 CurrentItems 속성의 경로를 통해 할 수

  • :

    {Binding Root.CurrentItem.CurrentItem.Value} 
    

글쎄, 당신은 거의 아무것도에 바인딩 할 수 있습니다, 문제는 일반적으로 당신이 그것을 가리 않는 방법이다.

(또한 데이터보다는 TreeViewItems로 모든 항목을 가정 TreeViewtv 익명을 가정) 당신이 cc에 도착하는 선택에 바인딩 상대 할 수 있다면이 경우
:

{Binding SelectedItem.Parent, ElementName=tv} 

물론 이것은 bbb뿐만 아니라 모든 하위 선택과 함께 cc에 바인딩됩니다.

아니면 어떤 선택으로부터 독립적 인 인덱스를 통해 드릴 다운 할 수 있습니다 :

{Binding Items[2].Items[2], ElementName=tv} 

당신이 달성하고자하는 일에 대해 더 구체적으로 할 수 있습니다.

+0

약간의 내용을 명확히하기 위해 질문을 업데이트했습니다. –

+0

이 질문이 유용하지 않다면 제 질문을 사과했습니다. –

+0

답변을 주셔서 감사합니다. 올바른 방향으로 생각을 푸는 데 많은 도움이되었습니다. 내가 어떻게 작동하게되었는지에 대한 나의 업데이트를 볼 수 있습니다. –

0

MVVM 패턴을 이미 사용하고있는 경우 프로세스가 매우 쉽습니다.

뷰 모델에 IsSelected 속성을 추가하십시오. 사용자가 TreeViewItem을 선택하면 바인딩 된 개체의 IsSelected 속성이 설정됩니다.

이제 IsSelected 속성에서 트리보기 항목을 선택할 때 변경할 컨트롤의 속성을 업데이트하십시오.

C#을 샘플

public class TreeViewItemViewModel 
{ 

    public bool IsSelected { 
     get { return _isSelected; } 
     set { 
      if (value != _isSelected) { 
       _isSelected = value; 
       this.IsSelectedChanged(); 
      } 
     } 
    } 

    protected virtual void IsSelectedChanged() 
    { 
     this.RaisePropertyChanged("IsSelected"); 
     // do custom code 
    } 

} 

VB.NET 샘플

Public Class TreeViewItemViewModel 

    Public Property IsSelected As Boolean 
     Get 
      Return _isSelected 
     End Get 
     Set(value As Boolean) 
      If value <> _isSelected Then 
       _isSelected = value 
       Me.IsSelectedChanged() 
      End If 
     End Set 
    End Property 

    Protected Overridable Sub IsSelectedChanged() 
     Me.RaisePropertyChanged("IsSelected") 
     ' do custom code ' 
    End Sub 

End Class 
관련 문제