代码之家  ›  专栏  ›  技术社区  ›  Johnny

视图中的鼠标双击事件

  •  1
  • Johnny  · 技术社区  · 16 年前

    如何在视图中绑定wpfdatagrid的MouseDoubleClick事件,因为我正在使用mvvm和prism2。

    2 回复  |  直到 16 年前
        1
  •  -1
  •   jbe    16 年前

    在视图的代码隐藏中侦听MouseDoubleClick事件,并在ViewModel上调用相应的方法:

    public class MyView : UserControl 
    {
        ...
    
        private MyViewModel ViewModel { get { return DataContext as MyViewModel; } }
    
        private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            ViewModel.OpenSelectedItem();
        }
    
        2
  •  2
  •   Wilmar    16 年前

    我更喜欢添加一个mousedoubleclickbehavior,然后您可以将它附加到任何控件,该控件将绑定到您的ViewModel。从视图的代码后面调用命令会创建我不喜欢的直接依赖关系。

    public static class MouseDoubleClickBehaviour
    {
        public static readonly DependencyProperty CommandProperty =
            DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(MouseDoubleClickBehaviour), new UIPropertyMetadata(null, OnCommandChanged));
    
        public static readonly DependencyProperty CommandParameterProperty =
            DependencyProperty.RegisterAttached("CommandParameter", typeof(object), typeof(MouseDoubleClickBehaviour), new UIPropertyMetadata(null));
    
        public static ICommand GetCommand(DependencyObject obj)
        {
            return (ICommand)obj.GetValue(CommandProperty);
        }
    
        public static void SetCommand(DependencyObject obj, ICommand value)
        {
            obj.SetValue(CommandProperty, value);
        }
    
        public static object GetCommandParameter(DependencyObject obj)
        {
            return obj.GetValue(CommandParameterProperty);
        }
    
        public static void SetCommandParameter(DependencyObject obj, object value)
        {
            obj.SetValue(CommandParameterProperty, value);
        }
    
        private static void OnCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
        {
            var grid = target as Selector;
    
            ////Selector selector = target as Selector;
            if (grid == null)
            {
                return;
            }
    
            grid.MouseDoubleClick += (a, b) => GetCommand(grid).Execute(grid.SelectedItem);
        }
    }
    

    然后可以在XAML中执行此操作

    <ListView ...
         behaviours:MouseDoubleClickBehaviour.Command="{Binding Path=ItemSelectedCommand}"
         behaviours:MouseDoubleClickBehaviour.CommandParameter="{Binding ElementName=txtValue, Path=Text}"
     .../>