2012-04-29 6 views
0

У меня есть элемент управления TreeView, и после добавления нового узла мне нужно выполнить какой-то пользовательский код (например, развернуть узел, сделать его видимым и запустить метод редактирования). Поскольку я хочу, чтобы это было доступно в каждом экземпляре элемента управления TreeView, я подумал о подклассе элемента управления TreeView.Выполнение пользовательского кода после выполнения команды

Теперь, чтобы древовидная структура узнала, когда добавлен новый узел, у него будет либо событие, которое будет запущено, когда элемент будет добавлен (что это не так), либо будет иметь ссылку на команду, которая была выполнена для добавления нового элемента.

Так два вопрос:

1) Есть ли способ, чтобы добавить событие в TreeView, который будет уволен каждый раз, когда добавляется TreeNode (я всегда добавляю узлы через исходную коллекцию из ViewModel) - я не мог найти любым способом сделать это

2) Я могу добавить свойство AddCommand в TreeList, которое будет привязано к AddCommand ViewModel, а затем добавит некоторую кнопку или элемент ContextMenu, который будет привязан к TreeList.AddCommand, а не к модели. Таким образом TreeView будет ссылаться на AddCommand, но недостатком будет то, что фактическое использование было бы довольно странным. Вопрос: Как я могу узнать, когда выполняется AddCommand TreeView (или любая команда), поэтому я могу запустить некоторый пользовательский код после него? Кажется, что 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 правильный. Когда элемент Items элемента управления связан с коллекцией, он уведомляется, когда элемент добавляется или удаляется, прослушивая событие INotifyCollectionChanged. ObservableCollection вызывает это событие, когда элемент добавляется или удаляется, поэтому «автомагистрально» «View» знает об изменениях. TreeView обрабатывает эти изменения с помощью обработчика OnItemsChanged. Когда коллекция вызывает событие INotifyCollectionChanged, будет вызываться обработчик OnItemsChanged. –

+0

Это правильно. Когда ItemSource инициализируется, OnItemsChanged вызывается с e.Action = NotifyCollectionChangedAction.Reset. Существуют перечисления для добавления/удаления/замены/перемещения/сброса. – Phil

Смежные вопросы