2010-02-24 16 views
6

Apuesto a que esto se ha contestado muchas veces, pero ...WPF - Manejar un ApplicationCommand en el modelo de vista

Para una situación simple donde un botón en un control de usuario tiene la propiedad de comandos establece en algo así como Find (ApplicationCommands .Find) ¿cómo manejaría ViewModel ese comando? Normalmente veo controladores de comandos conectados con un CommandBinding que se agrega a una colección de CommandBindings en un UIElement, pero mi ViewModel no se deriva de UIElement (¿o sí?). Los propios comandos no exponen los eventos para notificar cuándo se han ejecutado, entonces, ¿dónde debo conectarlos para obtener esa información?

EDITAR: Me gustaría utilizar stock WPF para resolver el problema si es posible. Sé que hay muchos marcos disponibles para este tipo de cosas, pero me gustaría mantener el código simple.

EDIT2: Incluyendo algunos ejemplos de código.

<UserControl> 
    <UserControl.DataContext> 
    <local:MyViewModel/> 
    </UserControl.DataContext> 

    <Button Command="Find"/> 
</UserControl> 

Dónde:

class MyViewModel 
{ 
    // Handle commands from the view here. 
} 

que podría añadir un CommandBinding al control de usuario, que se ocuparía Ejecutado, a continuación, llamar a un método Find hipotético en el MyViewModel el que hace el trabajo real, pero eso es código adicional e innecesario. Preferiría que ViewModel manejara el comando Buscar. Una posible solución sería hacer que MyViewModel se derivara de UIElement, sin embargo, eso parece contrario a la intuición.

Respuesta

4

El propósito de los comandos es desacoplar el código que genera el pedido desde el código que lo ejecuta. Por lo tanto: si quieres estrecho acoplamiento, usted debe hacer mejor que a través de eventos:

<UserControl ... x:Class="myclass"> 
    ... 
    <Button Click="myclass_find" .../> 
    ... 
</UserControl> 

Para el acoplamiento débil es necesario agregar un CommandBinding a su UserControl:

<UserControl ... > 
    <UserControl.DataContext> 
     <local:MyViewModel/> 
    </UserControl.DataContext> 

    <UserControl.CommandBindings> 
     <Binding Path="myFindCommandBindingInMyViewModel"/> 
    </UserControl.CommandBindings> 
    ... 
    <Button Command="ApplicationComamnd.Find" .../> 
    ... 
</UserControl> 

(no está seguro acerca la sintaxis)

O puede agregar un CommandBinding a su UserControl 's CommandBindings en el constructor, tomando el val desde ViewNodel:

partial class MyUserControl : UserControl 
{ 
    public MyUSerControl() 
    { 
     InitializeComponent(); 
     CommandBinding findCommandBinding = 
        ((MyViewModel)this.DataContext).myFindCommandBindingInMyViewModel; 
     this.CommandBindings.Add(findCommandBinding); 
    } 
} 
+0

Prefiero el acoplamiento libre, así que estoy buscando una respuesta que muestre cómo manejar el comando en una clase separada de UserControl. –

+0

¿Desea procesar 'ApplicationCommands.Find' de la misma manera para todas las fuentes? – Vlad

+0

Agregué un código para aclarar dónde quiero manejar la ejecución del comando. Me gustaría manejar los comandos en el ViewModel, no en el UserControl en sí mismo, de acuerdo con la filosofía general de MVVM. –

Cuestiones relacionadas