2012-04-29 3 views
0

TreeView 컨트롤이 있고 새 노드를 추가 한 후 일부 사용자 지정 코드를 실행해야합니다 (예 : 노드 확장, 표시 가능 및 편집 메서드 실행 불가). 이후 TreeView 컨트롤의 모든 인스턴스에서 사용할 수 있기를 원하기 때문에 TreeView 컨트롤을 서브 클래 싱하는 것을 고려했습니다.명령을 실행 한 후 사용자 지정 코드를 실행하십시오.

새 노드가 추가 된 시점을 treeview에 알리려면 아이템이 추가 될 때 발생하는 이벤트가 있거나 (실행되지 않은 이벤트) 실행 된 명령에 대한 참조가 있어야합니다 새 항목을 추가합니다.

그래서 두 가지 질문이 :

1)의 TreeNode가 추가 될 때마다 해고 될 것이다 트 리뷰에서 이벤트를 추가하는 방법은 (내가 항상 뷰 모델에서 소스 컬렉션을 노드를 추가하고) 있는가 - 나는 찾을 수 없습니다 어떤 방법이든지

2) TreeList에 AddCommand 속성을 추가 할 수 있습니다. ViewModel의 AddCommand에 바인딩 된 다음 뷰 모델 대신 TreeList.AddCommand에 바인딩 할 ContextMenu 항목 또는 일부 단추가있을 수 있습니다. 이 방법은 TreeView AddCommand에 대한 참조를 보유하지만, 단점은 실제 사용량이 일종의 wierd 것입니다. 질문 : TreeView의 AddCommand (또는 해당 명령)가 실행될 때 어떻게 알 수 있습니까? 그러면 사용자 정의 코드가 실행될 수 있습니까? CommandManager.AddExecutedHandler가 해결책 인 것 같지만 실행할 수 없습니다.

답변

0

이 도움이 무엇입니까?

public class CustomTreeControl : TreeView 
{ 
    ... 

    // WPF only 
    protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue) 
    { 
     base.OnItemsSourceChanged(oldValue, newValue); 

     Debug.WriteLine("OnItemsSourceChanged"); 
    } 

    // WPF + Silverlight 
    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) 
    { 
     base.OnItemsChanged(e); 

     Debug.WriteLine("OnItemsChanged: {0}", e.Action); 
    } 
} 
+0

아니요,이 이벤트는 항목이 추가/제거 될 때가 아니라 ItemsSource에 바인딩 된 전체 모음이 변경된 경우에만 발생하는 것으로 보입니다. – Goran

+0

@Phil이 맞습니다. 컨트롤의 ItemsSource가 컬렉션에 바인딩되면 INotifyCollectionChanged 이벤트를 수신하여 요소가 추가되거나 제거 될 때이를 알립니다. ObservableCollection은 요소가 추가되거나 제거 될 때이 이벤트를 발생시킵니다. 따라서 뷰가 '자동으로'자동으로 변경 사항을 알고 있습니다. TreeView는 OnItemsChanged 처리기를 통해 이러한 변경 내용을 처리합니다. 컬렉션에서 INotifyCollectionChanged 이벤트가 발생하면 OnItemsChanged 핸들러가 호출됩니다. –

+0

맞습니다. ItemsSource가 초기화되면 OnItemsChanged는 e.Action = NotifyCollectionChangedAction.Reset과 함께 호출됩니다. Add/Remove/Replace/Move/Reset에 대한 열거 형이 있습니다. – Phil

관련 문제