Treeview двойной клик событие - PullRequest
0 голосов
/ 21 марта 2012

У меня есть два представления с контролем дерева.В обоих файлах XAML я добавил событие двойного клика:

<TreeView x:Name="tvTest" ItemsSource="{Binding}" Style="{StaticResource TreeviewStyle}" MouseDoubleClick="tvTest_MouseDoubleClick">

Обработчик событий генерируется в представлении кода позади.Я знаю, что это может быть не самым элегантным способом, но, поскольку в древовидной структуре отсутствует командный объект, я пока придерживаюсь этого:

Public Sub tvTest_MouseDoubleClick(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs)

End Sub

В первом представлении это работает правильно, но во втором представлении это дает мне следующееошибка:
* tvTest_MouseDoubleClick не является членом MySecondView. *

Почему это так?Ошибка возникает в сгенерированном дизайнером коде:

AddHandler Me.tvTest.MouseDoubleClick, New System.Windows.Input.MouseButtonEventHandler(AddressOf Me.tvTest_MouseDoubleClick)

С уважением,

Мишель

РЕДАКТИРОВАТЬ:
Проголосовал за решение Алекса,Однако, чтобы все исправить, я использовал http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/

1 Ответ

1 голос
/ 21 марта 2012

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

Я знаю, вы сказали, что TreeView не имеет команды двойного щелчка, но это не может помешать нам создать ее для себя.

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

    public class DoubleClickCommand
    {
        public static object GetDoubleClickParameter(DependencyObject obj)
        {
            return (object)obj.GetValue(DoubleClickParameterProperty);
        }

        public static void SetDoubleClickParameter(DependencyObject obj, object value)
        {
            obj.SetValue(DoubleClickParameterProperty, value);
        }

        public static ICommand GetDoubleClickCommand(DependencyObject obj)
        {
            return (ICommand)obj.GetValue(DoubleClickCommandProperty);
        }

        public static void SetDoubleClickCommand(DependencyObject obj, ICommand value)
        {
            obj.SetValue(DoubleClickCommandProperty, value);
        }


        public static readonly DependencyProperty DoubleClickParameterProperty = DependencyProperty.RegisterAttached("DoubleClickParameter", typeof(object), typeof(DoubleClickCommand), new UIPropertyMetadata(null));

        public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.RegisterAttached("DoubleClickCommand", typeof(ICommand), typeof(DoubleClickCommand), new UIPropertyMetadata(null, OnDoubleClickCommandChanged));


        private static void OnDoubleClickCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
        {
            FrameworkElement elem = d as FrameworkElement;
            var newCommand = args.NewValue as ICommand;
            if (elem != null)
            {
                if (newCommand != null)
                {
                    elem.MouseLeftButtonDown += elem_MouseLeftButtonDown;
                }
                else
                {
                    elem.MouseLeftButtonDown -= elem_MouseLeftButtonDown;
                }
            }
        }

        private static void elem_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            if (e.ClickCount > 1)
            {
                DependencyObject dep = sender as DependencyObject;
                ICommand command = GetDoubleClickCommand(dep) as ICommand;
                var parameter = GetDoubleClickParameter(dep);
                if (command != null)
                {
                    if (command.CanExecute(parameter))
                    {
                        command.Execute(parameter);
                    }
                }
            }
        }
    }

Чтобы использовать его для TreeViewItems, просто установите Command и CommandParameter (необязательно) на ItemTemplate вашего TreeView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...