2012-04-29 73 views
0

我有一個TreeView控件,並且在添加新節點後,我需要執行一些自定義代碼(展開節點,使其可見,並引發begind編輯方法)。因爲我希望這可以在TreeView控件的每個實例中使用,所以我想到了TreeView控件的子類化。現在執行命令後執行自定義代碼

,爲了使樹視圖知道何時添加的新節點,它要麼必須當添加項目時觸發的事件(其不),或者有一個參考以命令被執行添加一個新項目。

所以兩個問題:

1)是否有辦法在TreeView控件添加事件時添加一個樹節點,將被開除(我一直在增加,通過從視圖模型源集合節點) - 我無法找到任何方式來做到這一點

2)我可以添加一個AddCommand屬性到TreeList,這將綁定到ViewModel的AddCommand,然後有一些按鈕或ContextMenu項將綁定到TreeList.AddCommand,而不是視圖模型。通過這種方式,TreeView將持有對AddCommand的引用,但缺點是實際使用會有點奇怪。問題:如何知道何時執行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 2012-04-29 15:33:37

+0

@菲爾是正確的。 當控件的ItemsSource綁定到集合時,會通過偵聽INotifyCollectionChanged事件來添加或刪除元素時收到通知。當一個元素被添加或刪除時,ObservableCollection會引發這個事件,這就是爲什麼View'自動變魔術'知道變化的原因。 TreeView通過OnItemsChanged處理程序處理這些更改。當集合引發INotifyCollectionChanged事件時,將調用OnItemsChanged處理程序。 – 2012-04-29 16:03:34

+0

這是正確的。當ItemsSource被初始化時通過e.Action = NotifyCollectionChangedAction.Reset調用OnItemsChanged。有添加/刪除/替換/移動/重置的枚舉。 – Phil 2012-04-29 16:18:53