2011-07-19 15 views
19

Acabo de comenzar a aprender el marco de MVVM Light y no puedo encontrar ejemplos claros sobre cómo usar un RelayCommand. Para fines de aprendizaje, me gustaría tener un botón en mi vista que, al hacer clic en mostrar, sea un cuadro de mensaje mundial de mundo hello, y que esté habilitado en cada minuto par (básicamente, si DateTime.Now.Minute% 2 == 0) .Cómo utilizar RelayCommand con el marco de MVVM Light

¿Cómo se vería el botón XAML y cómo se definiría el RelayCommand HelloWorld en ViewModel?

Gracias por su ayuda !!

Respuesta

39

RelayCommand tiene como objetivo implementar la interfaz ICommand que Button necesita y pasar las llamadas a otra función que generalmente se encuentra junto a ellas en ViewModel.

Así, por ejemplo, tendría que tener una clase ViewModel como:

class HelloWorldViewModel : ViewModelBase 
{ 
    public RelayCommand DisplayMessageCommand { get; private set; } 

    private DispatchTimer _timer; 

    public HelloWorldViewModel() 
    { 
     this.DisplayMessageCommand = new RelayCommand(this.DisplayMessage, CanDisplayMessage); 

     // Create a timer to go off once a minute to call RaiseCanExecuteChanged 
     _timer = new DispatchTimer(); 
     _timer = dispatcherTimer.Tick += OnTimerTick; 
     _timer.Interval = new Timespan(0, 1, 0); 
     _timer.Start(); 
    } 

    private void OnTimerTick(object sender, EventArgs e) 
    { 
     this.DisplayMessageCommand.RaiseCanExecuteChanged(); 
    } 

    public bool CanDisplayMessage() 
    { 
     return DateTime.Now.Minute % 2 == 0; 
    } 

    public void DisplayMessage() 
    { 
     //TODO: Do code here to display your message to the user 
    } 
} 

En el control que tendría el DataContext conjunto, ya sea en el código detrás o en el XAML directamente a través de un DataContext={StaticResource ...}

Su botón entonces unirse a la orden en el modelo de vista al igual que

<Button Content='Push me' Command='{Binding DisplayMessageCommand}' /> 

Cuando se hace clic en el botón, se utiliza el DisplayMessageCommand y llama al Execute() en este objeto que RelayCommand acaba de pasar al método DisplayMessage.

El DispatchTimer se apaga una vez por minuto y llama al RaiseCanExecuteChanged(). Esto permite que el botón que está vinculado al comando vuelva a verificar si el comando sigue siendo válido o no. De lo contrario, puede hacer clic en el botón solo para descubrir que el comando no está disponible actualmente.

+0

Gran! ¡Gracias por aclarar eso para mí! – Evan

+0

Solo por curiosidad, ¿hay alguna manera de vincular el CanDisplayMessage() del comando con la propiedad IsEnabled? – Evan

+0

@evan, si se refiere a la propiedad IsEnabled del Botón? Esto se hace automáticamente si configura el objeto Comando en el Botón – MerickOWA

5

O con lambda

private RelayCommand<anyobject> _AddCmd; 
    public ICommand AddPoint 
    { 
     get 
     { 
      return _AddCmd ?? 
       (
       _AddCmd = new RelayCommand 
        (
         (obj) => 
         { 
          ViewModelWF.ZeroPoints.Add(new WM.Point(0, 0)); 
         } 
        ) 
       ); 
     } 
    } 

    private RelayCommand _DeleteCmd; 
    public ICommand DeletePoint 
    { 
     get 
     { 
      return _DeleteCmd ?? 
       (
       _DeleteCmd = new RelayCommand 
        (
         () => 
         { 
          int idx = wpfZeroPoints.SelectedIndex; 
         }, 
         () => 
         { 
          return wpfZeroPoints.SelectedIndex <= 0; 
         } 
        ) 
       ); 
     } 
    } 
Cuestiones relacionadas