Почему элементы в TreeViewItem наследуют обработчики событий родителя?

Итак, я создаю TreeViewItem (parentNode) и добавляю TreeViewItems в TreeViewItem parentNode. Затем я добавляю MouseButtonEventHandler к parentNode, и теперь все TreeViewItems внутри parentNode имеют MouseButtonEventHandler. Я запустил отладчик, чтобы проверить, нет ли случайно написанного кода для добавления MouseButtonHandler, но его нет...

Редактировать: я провел дополнительные тесты, и он даже опустился на два уровня. Есть ли способ изолировать обработчики событий только для конкретного узла, а не для его дочерних элементов и/или родителей?

public newClass() {
    TreeViewItem parent = new TreeViewItem();

    TreeViewItem childOne = new TreeviewItem();
    addExpandClickListener(childOne);

    TreeViewItem childTwo = new TreeviewItem();
    TreeViewItem childThree = new TreeViewItem();


    childTwo.Items.Add(childThree);
    childOne.Items.Add(childTwo);
    parent.Items.Add(childOne);
    TreeViewObject.Items.Add(parent);
}

private void addExpandClickListener(TreeViewItem item) { item.MouseLeftButtonUp += new MouseButtonEventHandler(item_MouseClick); }


private void item_MouseClick(object sender, MouseButtonEventArgs e) {
    // Define click event as handled
    e.Handled = true;
    if(sender != e.Source) return;
    // Handle click event
    TreeViewItem root = (TreeViewItem)sender;
    if(root.IsExpanded == true) CollapseRecursive(root);
    else root.IsExpanded = true;
    //else root.ExpandSubtree();
    ViewTree.Items.Refresh();
}

person Bob.    schedule 04.07.2012    source источник
comment
В каких местах вы вызываете метод addExpandClickListener? Дайте нам этот код   -  person Dusan    schedule 05.07.2012
comment
@Dusan Добавлен код, который вызывает метод addExpandClickListener.   -  person Bob.    schedule 05.07.2012


Ответы (1)


Область родительского узла включает в себя области дочерних узлов. Подумайте о перекрывающихся прямоугольниках. Если вы хотите, чтобы щелчок работал только с текстовой частью, вам придется либо предоставить свой собственный DataTemplate, либо использовать визуальное дерево, чтобы найти заголовок и применить к нему щелчок.

person Joel Lucsy    schedule 05.07.2012
comment
Что значит текстовая часть. - person Bob.; 05.07.2012
comment
Элемент древовидной структуры разбит на несколько частей. Плюс/минус, заголовок или текст и дочерние элементы. Думайте об этом как о расширителе, где плюс управляет видимостью дочерних элементов. По умолчанию заголовок представляет собой строку, но может быть чем угодно, например, пользовательским элементом управления, кнопкой и т. д. - person Joel Lucsy; 05.07.2012
comment
Это довольно аккуратно. В итоге я использовал TextBlock и добавил к нему текст, а также добавил обработчик события клика в TextBlock и добавил его в заголовок. - person Bob.; 06.07.2012