2013-05-21 2 views
0

내 문제는 다음과 같습니다. ItemsSource에 묶여있는 treeView가 있습니다. SelectedItem은 으로 SelectedItem이라는 내 ViewModel의 속성에 바인딩됩니다. 내가, 삭제 ... 항목을 다시 정렬 할TreeView에서 부모 목록 가져 오기

public class Item 
{ 
     public Header { get; set; } 
     public ObservableCollection<Item> ItemChildren { get; set; } 
. 
. 
. 
} 

:

ItemsSource처럼 구축이다. 그래서 이렇게하려면 SelectedItem의 부모 목록이 필요합니다. 항목에 대한 모든 목록을 조사 할 수는 있지만 항목이 두 번 존재할 수 있으며 구분 기호로는 항목이 null 일 수 있습니다.

내가 선택한 항목의 상위 목록을 가져 오는 방법을 아는 사람이 있습니까?

대단히 감사합니다!

감사합니다, 케빈

답변

1

그 나무가 있다면, 당신은 부모에 대한 부모의 목록 만 참조 필요가 없습니다

public class Item 
{ 
    public Item() 
    { 
     _col = new ObservableCollection<Item>(); 
     _col.CollectionChanged += 
      new NotifyCollectionChanged(ItemChildren_CollectionChanged); 
    } 

    public Header { get; set; } 
    public ObservableCollection<Item> ItemChildren 
    { get { return _col; } } 

    public Item Parent { get { return _parent; } } 

    private void ItemChildren_CollectionChanged(
     object sender, 
     NotifyCollectionChangedEventArgs e) 
    { 
     // for all newly added items: item._parent = this; 
     // for all removed items: item._parent = null; 
    } 

    private Item _parent; 
    private ObservableCollection<Item> _col; 

} 

이 솔루션은보다 복잡 무엇 너 시작 했어. 부모 개체는 자식을 추적해야하며 자식 개체가 추가 될 때마다 자식 개체의 Parent가 해당 부모 개체에 설정되어 있는지 확인해야합니다.

구문 검사없이이 코드를 입력했지만 요점을 나타냅니다. 이 기사에서 거의 같은 질문에 대한 전체 소스 코드를 찾을 수 있습니다 : How to Implement Collection Property to Contain Unique Objects.

편집 : 위 코드의 Item 클래스는 발신자가 ItemChildren 콜렉션을 설정할 수 없음을주의하십시오. 그 컬렉션은 Item 인스턴스에 의해 생성되고 제공되며 아무도 변경할 수 없습니다. 그러나 누구나 항목을 추가/제거 할 수 있습니다. 아이템이 새로 추가 된 하위 항목을 처리하는 방법이 하나 더 있습니다. 누군가가 null이 아닌 Parent 참조로 항목을 추가하려고하면 InvalidOperationException을 던질 수 있습니다! 그러면 구조가 나무처럼 유지됩니다. 예를 들어, 인수가 이미 현재 노드의 조상 인 경우 XmlNode 클래스 (System.Xml)는 InvalidOperationExceptionAppendChild에서 가져옵니다. Item에 추가 된 요소를 확인할 기회가있을 때 가능성은 무한합니다.

+0

대단히 감사합니다. 그게 정확히 내가 찾고 있던거야! – Kevin