¿Comandos vinculantes a eventos?

¿Cuál es un buen método para vincular comandos a eventos? En mi aplicación WPF, hay eventos que me gustaría capturar y procesar por mi ViewModel, pero no estoy seguro de cómo. Cosas como perder el foco, mouseover, mousemove, etc. Como trato de seguir el patrón de MVVM, me pregunto si hay una solución XAML pura.

¡Gracias!

Eche un vistazo al Comportamiento de comando adjunto de Marlon Grech, podría ser exactamente lo que está buscando

Para manejar eventos, debe tener algún código que se adjunte al evento y ejecute su comando en respuesta. El objective final es tener en XAML:

MouseMoveCommand="{Binding MyCommand}" 

Para lograr esto, necesita definir una propiedad adjunta para cada evento que quiera manejar. Mire esto para ver un ejemplo y un marco para hacer esto.

Usar System.Windows.Interactivity

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

Asegúrese de que su proyecto haga referencia al ensamblado System.Windows.Interactivity.

Fuente: MSDN Blog Ejecución de un comando de un evento de su elección

Lo implementé usando Propiedades adjuntas y Reflexión. No puedo decir que sea la mejor implementación, pero tal vez la mejore y pueda ser un buen comienzo para usted.

 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)) { } } 

Ejemplos de uso:

Ver

  

Modelo

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

No creo que pueda usarlo en XAML puro, pero eche un vistazo al comando Delegar .

Los comandos Ejecutar comando, Navegar fotogtwig y Delegar comando son un patrón bastante bueno. También se puede usar en Expression Blend.

En el lado de las “mejores prácticas”, debe pensar dos veces antes de convertir un evento en un comando. Normalmente, el comando es algo que el usuario hace intencionalmente, un evento más a menudo es solo un camino de interacción, y no debe dejar los límites de la vista.