2009-12-18 26 views
9

Solo me preguntaba qué tenían las personas para obtener ideas sobre cómo manejar mejor los eventos en un ViewModel desde los controles de una Vista ... de la manera más ligera posible.Manejo simple de eventos en MVVM

Ejemplo:

<MediaElement 
    MediaOpened={Binding SomeEventHandler} /> 

En este caso queremos controlar el evento MediaOpened en un modelo de vista. Sin un marco como Prism, ¿cómo vincular esto a un ViewModel?

Respuesta

12

Commanding - su 'SomeEventHandler' es necesario que haya una clase que implementa ICommand ... hay un montón de literatura disponible en línea ...

también - me gustaría considerar la obtención de un marco libre, ligero 'Mini' MVVM , como MvvmFoundation, que proporciona la RelayCommand para tal propósito (sin la complejidad/sobrecarga de aprendizaje PRISM)

EDIT:

Tenga una mirada en this b inicie sesión para adjuntar el comando a cualquier evento ... Es increíblemente poderoso, como mencioné, pero creo que es necesario hacer una llamada de juicio si esto es lo que quiere, en comparación con algo así como adjuntar un evento pasado de moda, y el uso un controlador de eventos súper delgado en su código detrás que simplemente invoca un método en su modelo de vista, algo así como:

public void SomeEventHandler(object sender, SomeEventArgs e) 
{ 
    MyViewModel vm = (MyViewModel)this.DataContext; 
    vm.HandleLoadEvent(); 
} 

pragmática frente de mejores prácticas ... lo dejo con ustedes;)

+0

No pensé que podría utilizar un ICommand en este tipo de escenario ... gracias por la información ... esto es un poco de una pregunta repetida a continuación, . –

+0

Ok ... Solo traté de usar ICommand, estoy usando MVVMFoundation, por lo que es un tipo RelayCommand. Sin embargo, aparece un error de compilación "Binding Path = MediaOpenedCommand, Mode = OneTime}" no es un nombre de método de controlador de eventos válido ... "¿Lo estoy configurando mal? –

+0

lo siento, sí ... tendrá que vincular la instancia de RelayCommand a un comando, y vincular esto de nuevo a la interfaz de usuario a través de combinaciones de comandos o entradas de entrada ...Te recomiendo que hagas un poquito de lectura: pasar de los eventos a los comandos es una de esas "curvas de aprendizaje pronunciadas" que la gente sigue haciendo con WPF, ¡pero tan poderosa cuando la asimilas! – kiwipom

0

MediaOpened es un evento y no admite el enlace de comandos.

Para enlazar al evento se puede usar un objeto auxiliar que se conecta al evento y ejecuta un comando.

Para enlazar al modelo de vista, añada una propiedad que implemente ICommand. La Figura 3 en este artículo de la revista MSDN muestra el RelayCommand que es una implementación útil de ICommand. RelayCommand se inicializa con un delegado para conectarse a su modelo de vista.

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

+0

Obtengo el problema de Encuadernación por comando y he leído el artículo de Josh Smith sobre MVVM, pero la parte con la que tengo un problema es el "para enlazar al evento que se puede usar un objeto auxiliar que se conecta al evento y ejecuta un comando ". Por objeto auxiliar, ¿te refieres a un comportamiento adjunto? –

+0

Sí, un Comportamiento es una buena manera de hacer el enlace. El enlace que IanR proporcionó se ve bien. –

0

El marco pequeño y de código abierto ImpromptuInterface.MVVM tiene un event binding syntax y usa el dlr en .net 4.0. Aunque este ejemplo requiere una subclasificación de ImpromptuViewModel. El event binding property no tiene ninguna dependencia en ese tipo de modelo de vista específico y el eventbinding provider involucrado es público.

<Window x:Class="MyProject.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:MVVM="clr-namespace:ImpromptuInterface.MVVM;assembly=ImpromptuInterface.MVVM" Title="MainWindow" Height="600" Width="800"> 

    <MediaElement MVVM:Event.Bind="{Binding Events.MediaOpened.To[MediaElement_MediaOpened]}" /> 

...

public class MyViewModel{ 

    public dynamic Events 
    { 
     get { return new EventBinder(this); } 
    } 

    public void MediaElement_MediaOpened(MediaElement sender, RoutedEventArgs e){ 
     ... 
    } 
} 
Cuestiones relacionadas