Почему e.Source зависит от метода заполнения TreeView? - PullRequest
3 голосов
/ 27 февраля 2009

У меня есть два дерева:

  1. fooTree - состоит из элементов,
  2. barTree - построено

Оба дерева имеют событие MouseRightButtonDown, но тип e.Source отличается:

  1. fooTree - System.Windows.Controls.TreeViewItem
  2. barTree - System.Windows.Controls.TreeView

Почему e.Source отличается? Кроме того, как я могу получить выбранный элемент для barTree?

Markup:

    <TreeView Name="fooTree" MouseRightButtonDown="fooTree_MouseDown">
        <TreeViewItem Header="foo"></TreeViewItem>
        <TreeViewItem Header="foo"></TreeViewItem>
    </TreeView>

    <TreeView Name="barTree" MouseRightButtonDown="barTree_MouseDown" ItemsSource="{Binding BarItems}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate>
                <TextBlock Text="{Binding}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

Код:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public string[] BarItems
    {
        get { return new string[] { "bar", "bar" }; }
    }

    private void barTree_MouseDown(object sender, MouseButtonEventArgs e) 
    {
    }

    private void fooTree_MouseDown(object sender, MouseButtonEventArgs e) 
    {
    }
}

Ответы [ 2 ]

8 голосов
/ 27 февраля 2009

Не знаю, почему это происходит, но, по крайней мере, я нашел решение:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0d3af69-6ecc-4ddb-9526-588b72d5196b/

  1. Если ваш обработчик находится в TreeView, используйте свойство OriginalSource в аргументы события и подняться визуальный родительская цепь, пока вы не найдете TreeViewItem. Затем выберите его. Вы можете пройти визуальную родительскую цепочку, используя System.Windows.Media.VisualTreeHelper.GetParent.

  2. Вы можете попробовать зарегистрировать обработчик класса для типа TreeViewItem и событие мыши вниз Затем ваш обработчик должен вызываться только когда мышь события проходят через TreeViewItem элементы.

  3. Вы можете зарегистрировать обработчик класса для типа TreeViewItem и контекста событие открытия меню.

Итак, мой код:

private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
}

static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
{
    while (source != null && source.GetType() != typeof(T))
        source = VisualTreeHelper.GetParent(source);

    return source;
}
1 голос
/ 27 февраля 2009

Вы можете получить выбранный предмет в корзине, используя:

((e.Source) as TreeView).SelectedValue

Но имейте в виду, что элемент должен быть выбран первым (используя leftMouse). Элемент не сразу выбран с помощью rightMouse ...

...