Почему это поведение 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) работает отлично!