2012-08-30 17 views
12

Estoy trabajando en mi aplicación de teléfono de Windows que utiliza algunos enlaces de datos simples. Ya creé una aplicación que se basó en el método de programación MvvM. La aplicación en la que estoy trabajando actualmente también funciona por el método MvvM. Como quiero mantener mi código lo más limpio posible, estaba buscando una forma de hacer que el "evento de clic de botón" (que normalmente tiene lugar en la página de código subyacente) tenga lugar en mi modelo de vista o modelo principal.Enlazar un botón a un comando (Windows Phone 7.5)

He buscado en Internet una explicación simple para la interfaz de Icommand porque creo que es el camino a seguir. El problema con las explicaciones que encontré fue que algunas de ellas se basaban en el kit de herramientas de MvvMlight utilizando la función CommandRelay. No quiero usar el kit de herramientas ligero MvvM porque primero quiero entender las cosas. Los otros tutoriales que encontré fueron escritos por desarrolladores entusiastas que te dan demasiada información.

Así que básicamente. ¿Puede alguien mostrarme que funciona la versión más simple de un comando de Icommand para un botón?

Respuesta

21

En el XAML:

<Button Content="My Button" Command="{Binding MyViewModelCommand}" /> 

En su opinión-modelo:

public class MyViewModel 
{ 

    public MyViewModel() 
    { 
     MyViewModelCommand = new ActionCommand(DoSomething); 
    } 

    public ICommand MyViewModelCommand { get; private set; } 

    private void DoSomething() 
    { 
     // no, seriously, do something here 
    } 
} 

INotifyPropertyChanged y otras cortesías vista-modelo elididas.
En la parte inferior de esta respuesta se muestra una forma alternativa de estructurar el comando en su modelo de vista.

Ahora, necesitará una implementación de ICommand. Sugiero comenzar con algo tan simple como este, y ampliar o implementar otras funciones/comandos según sea necesario:

public class ActionCommand : ICommand 
{ 
    private readonly Action _action; 

    public ActionCommand(Action action) 
    { 
     _action = action; 
    } 

    public void Execute(object parameter) 
    { 
     _action(); 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 
} 

Aquí es una forma alternativa para la disposición de su vista-modelo:

public class MyViewModel 
{ 
    private ICommand _myViewModelCommand; 
    public ICommand MyViewModelCommand 
    { 
     get 
     { 
      return _myViewModelCommand 
       ?? (_myViewModelCommand = new ActionCommand(() => 
       { 
        // your code here 
       })); 
     } 
    } 
} 
+0

Gracias Jay que era exactamente lo que estaba buscando :) plano y simple :) –

2

Para añadir a la respuesta Azulejos:

Mi preferido es el DelegateCommand de los Patrones y Prácticas equipo @ Microsoft. Consulte this post para obtener más información.

Cuestiones relacionadas