2009-10-09 20 views
5

Estoy construyendo una aplicación de entrada de datos simple en formato WPF usando el patrón MVVM. Cada formulario tiene un objeto presentador que expone todos los datos, etc. Me gustaría usar los Comandos WPF para habilitar y deshabilitar los botones Editar/Guardar/Eliminar y las opciones de menú.Comandos WPF - Hacerlo sin código subyacente

Mi problema es que este enfoque parece requerir que agregue muchos códigos al código subyacente. Estoy tratando de mantener mi capa de presentación lo más delgada posible, así que preferiría que este código/lógica estuviera dentro de mi clase presentadora (o ViewModel) en lugar de en código subyacente. ¿Alguien puede sugerir una manera de lograr lo mismo sin código subyacente?

Mi XAML se ve un poco como esto:

<Window.CommandBindings> 
    <CommandBinding 
     Command="ApplicationCommands.Save" 
     CanExecute="CommandBinding_CanExecute" 
     Executed="CommandBinding_Executed" 
    /> 
</Window.CommandBindings> 

y mi código subyacente se ve un poco como esto:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = (
     _presenter.SelectedStore != null && 
     _presenter.SelectedStore.IsValid); 
} 

Respuesta

11

El Modelo-Vista-ViewModel (MVVM) el patrón de diseño tiene como objetivo lograr exactamente ese objetivo, y el excellent article de Josh Smith explica cómo aplicarlo. Para los comandos, puede usar la clase RelayCommand que se describe en el artículo.

Dado que ya tiene un objeto presentador, puede dejar que esa clase exponga una propiedad ICommand que implemente la lógica deseada, y luego vincular el XAML a ese comando. Todo se explica en el artículo.

+0

Great link - cheers! –

0

Si está tratando específicamente de vincular un comando en ViewModel a uno de los comandos de aplicación en XAML, debe construir la infraestructura para hacerlo usted mismo. Aunque camine haciendo eso in this answer que le permite hacer algo como esto:

<local:RoutedCommandHandlers.Commands> 
    <local:RoutedCommandHandler RoutedCommand="ApplicationCommands.Save" 
           Command="{Binding TheSaveCommand}" /> 
</local:RoutedCommandHandlers.Commands> 
Cuestiones relacionadas