2011-07-05 16 views
8

Estoy empezando a usar commanding con MVVM en una aplicación. He encontrado varios ejemplos y lo he intentado de ambas maneras en mi código. Algunos ejemplos tienen el comando de unión en el xaml así:Encuadernación de comandos en XAML vs ICommand Propiedades en ViewModel

<CommandBinding Command="local:MainWindow.OpenRecentFile" 
       Executed="{Binding OpenRecentFile_Executed}" /> 
... 
<MenuItem Header="{x:Static culture:TextResource.RecentFilesMenuItem}" 
      Command="local:MainWindow.RecentFilesCommand" > 

Con OpenRecentFile_Executed siendo un método en el modelo de vista y un ICommand estáticas, así:

public static readonly ICommand OpenRecentFile = 
    new RoutedCommand("Open Recent", typeof(MainWindow)); 

También he visto donde hay una propiedad en el modelo de vista que es de tipo ICommand que está obligado a en la vista de este modo:

<MenuItem Header="Close Current File" 
      Command="{Binding CloseCurrentFileCommand}" 
      CommandParameter="{TemplateBinding DataContext}"/> 

y en el modelo de vista:

private ICommand closeCurrentFileCommand; 
public ICommand CloseCurrentFileCommand 
{ 
    get 
    { 
     if (closeCurrentFileCommand == null) 
     { 
      closeCurrentFileCommand = 
       new RelayCommand(param => this.CloseCurrentCedarFile(param)); 
     } 
     return closeCurrentFileCommand; 
    } 
} 

¿Cuáles son los beneficios/inconvenientes para cada método?

Respuesta

7

Depende de su diseño. Si opta por el enfoque rápido, una Ventana con código de fondo luego declarar comandos en XAML probablemente le ahorrará tiempo y reducirá el esfuerzo a largo plazo.

Si va a utilizar una aplicación MVVM, le sugiero encarecidamente que vincule ICommand, ya que los comandos en general son formas de manipular sus datos (abrir/guardar/editar) y esto debe definirse en ViewModel. Posiblemente un mayor esfuerzo dependa de la funcionalidad, pero MVVM es una excelente forma de hacerlo si está haciendo una aplicación más grande.

Al final ambos funcionarán igual pero es su diseño y enfoque lo que importa.

5

Creo que la principal diferencia entre estos es el enrutado naturaleza de la primera versión. El aspecto del enrutamiento puede hacer que el comando sea más poderoso para algunos escenarios, pero también puede causar más dolor. El dolor puede entrar en juego si intentas ejecutar el comando, pero el elemento ui objetivo no tiene foco.

Una implementación de ICommand basada en propiedades siempre funcionará porque no existe un paso de "enrutamiento" entre la invocación del comando y la entrega del comando.

Tiendo a utilizar principalmente comandos basados ​​en propiedades a menos que mi escenario requiera las características que ofrece el enrutamiento.

Cuestiones relacionadas