Почему это поведение ICommand всегда возвращает ноль?

У меня есть прикрепленное поведение, чтобы отвечать только на двойной щелчок на ListViewItem (не заголовок или где-либо еще в ListView) в приложении WPF MVVM. Это реализовано, как показано ниже:

        public static DependencyProperty ListViewItemMouseDoubleClickProperty = DependencyProperty.RegisterAttached("ListViewItemMouseDoubleClick",
        typeof(ICommand),
        typeof(AttachedBehaviors),
        new PropertyMetadata(ListViewItemMouseDoubleClick_PropertyChanged));

    public static void SetListViewItemMouseDoubleClick(UIElement element, ICommand value)
    {
        element.SetValue(ListViewItemMouseDoubleClickProperty, value);
    }

    public static ICommand GetListViewItemMouseDoubleClick(UIElement element)
    {
        return (ICommand)element.GetValue(ListViewItemMouseDoubleClickProperty);
    }

    private static void ListViewItemMouseDoubleClick_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        RoutedEventHandler handler = new RoutedEventHandler(ListViewItem_MouseDoubleClick);
        ListViewItem listViewItem = d as ListViewItem;
        if (listViewItem != null)
        {
            //if (e.OldValue != null)
            //{
            //    listViewItem.RemoveHandler(ListViewItem.MouseDoubleClickEvent, handler);
            //}
            //if (e.NewValue != null)
            //{
            //    listViewItem.AddHandler(ListViewItem.MouseDoubleClickEvent, handler);
            //}
            if (e.NewValue != null)
            {
                listViewItem.AddHandler(ListViewItem.MouseDoubleClickEvent, new RoutedEventHandler(handler));
            }
            else
            {
                listViewItem.RemoveHandler(ListViewItem.MouseDoubleClickEvent, new RoutedEventHandler(handler));
            }
        }
    }

    private static void ListViewItem_MouseDoubleClick(object sender, RoutedEventArgs e)
    {
        ListViewItem listViewItem = sender as ListViewItem;
        if (listViewItem != null)
        {
            var cmd = GetListViewItemMouseDoubleClick(listViewItem);
            if (cmd != null)
            {
                if (cmd.CanExecute(listViewItem))
                {
                    cmd.Execute(listViewItem);
                }
            }
        }
    }

Он используется в XAML, как показано (для краткости):

<ListView x:Name="lvMyListView" AllowDrop="False" Margin="0,0,0,0"
                              AlternationCount="2"
                              IsSynchronizedWithCurrentItem="True"
                              ItemContainerStyle="{StaticResource alternatingWithTriggers}"
                              VirtualizingPanel.IsVirtualizing="True"
                              VirtualizingPanel.IsContainerVirtualizable="True"
                              VirtualizingPanel.IsVirtualizingWhenGrouping="True"
                              ItemsSource="{Binding MyListViewData}"
                              SelectedItem="{Binding SelectedListViewItem}"
                              SelectedIndex="{Binding SelectedListViewItemIndex}">
                        <ListView.Resources>
                            <Style TargetType="{x:Type ListViewItem}">
                                <Setter Property="Behaviors:AttachedBehaviors.ListViewItemMouseDoubleClick"
                                        Value="{Binding ElementName=lvMyListView, Path=DataContext.DoSomethingHere}" />
                            </Style>
                        </ListView.Resources>

Двойной щелчок на ListViewItem правильно запускает обработчик событий, но строка, которая читает "var cmd = GetListViewItemMouseDoubleClick (listViewItem);", всегда возвращает ноль. Я делал многочисленные попытки, пробуя разные вещи, и поиски в Google, чтобы увидеть, смогу ли я решить проблему безуспешно.

Кто-нибудь, пожалуйста, просмотрите мой код и скажите, где я мог ошибиться? Спасибо, впереди!

PS - Аналогичная реализация для DataGridRow (буквально единственным изменением является ссылка элемента управления ListViewItem на DataGridRow) работает отлично!

0 ответов

Другие вопросы по тегам