将命令绑定到事件?

将命令绑定到事件的好方法是什么? 在我的WPF应用程序中,有些事件我想通过我的ViewModel捕获和处理,但我不确定如何。 失去焦点,鼠标hover,鼠标移动等等。因为我试图坚持MVVM模式,我想知道是否有纯XAML解决方案。

谢谢!

看看Marlon Grech的附加命令行为 ,它可能正是您正在寻找的

为了处理事件,您必须有一些代码将自身附加到事件并执行您的命令作为响应。 最终目标是在XAML中:

MouseMoveCommand="{Binding MyCommand}" 

为了实现此目的,您需要为要处理的每个事件定义附加属性。 请参阅此示例以及执行此操作的框架。

使用System.Windows.Interactivity

 …xmlns:i=http://schemas.microsoft.com/expression/2010/interactivity…       

确保您的项目引用程序集System.Windows.Interactivity。

来源: MSDN博客从您选择的事件中执行命令

我使用附加属性和reflection实现它。 我不能说它是最好的实现,但我可能会改进它,它可能是一个良好的开端。

 public class EventBinding : DependencyObject { public static string GetEventName(DependencyObject obj) { return (string)obj.GetValue(EventNameProperty); } public static void SetEventName(DependencyObject obj, string value) { obj.SetValue(EventNameProperty, value); var eventInfo = obj.GetType().GetEvent(value); var eventHandlerType = eventInfo.EventHandlerType; var eventHandlerMethod = typeof(EventBinding). GetMethod("EventHandlerMethod", BindingFlags.Static | BindingFlags.NonPublic); var eventHandlerParameters = eventHandlerType.GetMethod("Invoke").GetParameters(); var eventArgsParameterType = eventHandlerParameters. Where(p => typeof(EventArgs).IsAssignableFrom(p.ParameterType)). Single().ParameterType; eventHandlerMethod = eventHandlerMethod.MakeGenericMethod(eventArgsParameterType); eventInfo.AddEventHandler(obj, Delegate.CreateDelegate(eventHandlerType, eventHandlerMethod)); } private static void EventHandlerMethod(object sender, TEventArgs e) where TEventArgs : EventArgs { var command = GetCommand(sender as DependencyObject); command.Execute(new EventInfo(sender, e)); } public static readonly DependencyProperty EventNameProperty = DependencyProperty.RegisterAttached("EventName", typeof(string), typeof(EventHandler)); 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 readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(EventBinding)); } public class EventInfo { public object Sender { get; set; } public TEventArgs EventArgs { get; set; } public EventInfo(object sender, TEventArgs e) { Sender = sender; EventArgs = e; } } public class EventInfo : EventInfo { public EventInfo(object sender, EventArgs e) : base(sender, e) { } } public class EventBindingCommand : RelayCommand> where TEventArgs : EventArgs { public EventBindingCommand(EventHandler handler) : base(info => handler(info.Sender, info.EventArgs)) { } } 

用法示例:

视图

  

模型

 private EventBindingCommand _cellEditEndingCommand; public EventBindingCommand CellEditEndingCommand { get { return _cellEditEndingCommand ?? ( _cellEditEndingCommand = new EventBindingCommand(CellEditEndingHandler)); } } public void CellEditEndingHandler(object sender, DataGridCellEditEndingEventArgs e) { MessageBox.Show("Test"); } 

我不认为你可以在纯XAML中使用它,但看一下Delegate命令 。

执行命令,导航框架和委派命令行为是一个非常好的模式。 它也可以在Expression Blend中使用。

在“最佳实践”方面,在将事件转换为命令之前,您应该三思而后行。 通常,命令是用户故意做的事情,事件通常只是一个交互轨迹,不应该离开视图边界。