2009-12-15 7 views
6

Estoy trabajando en una aplicación WPF y entiendo bastante bien el patrón de comandos, pero he encontrado que hay varias implementaciones diferentes del patrón de comando para MVVM. Está la implementación de Josh Smith en su aplicación de ejemplo WPF, el DelegateCommand de Prism, y la implementación CommandBindings.¿Cuál es el patrón aceptado para WPF al mando en MVVM?

Mi pregunta es, ¿cuál es la mejor práctica generalmente aceptada para usar comandos con MVVM? Mi aplicación utiliza Prism para que DelegateCommand esté disponible para nosotros.

Los desarrolladores de mi equipo discuten sobre qué enfoque es el "mejor". A algunos no les gustan los numerosos archivos .cs generados para cada comando, otros prefieren que todo esté conectado a través de CommandBindings. Estoy perdido ¿Alguien puede arrojar algo de luz?

Respuesta

2

dos puntos a considerar:

Los comandos proporcionados por diferentes marcos MVVM, como el CommandSinkCommand o SimpleCommand (de Cinch), etc. trabajo como ICommands normales. En particular, el manejador CanExecute se evalúa cada vez que el WPF cree que algo ha sucedido que podría causar un cambio en la IU. También puede forzar manualmente esto a través del CommandManager.InvalidateRequerySuggested().

En contraste con esto, los DelegateCommands <> Prisma de no llamar al controlador de CanExecute a menos que llamar manualmente RaiseCanExecuteChanged() en el comando. Si desea cambiar este por lo que también se activa cuando los comandos son normalmente vuelve a consultar, ver el código en http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

EDIT:

Segundo punto: Los comandos de marcos MVVM aceptan generalmente un objeto como parámetro del comando. Por el contrario, los DelegateCommands <> de Prism se escriben con mayor fuerza (aunque, por supuesto, podría tener DelegateCommands si lo desea).

+0

Cambié la respuesta aceptada a la suya debido al excelente segundo párrafo. ¡Gracias por el aporte! –

+0

Consulte también MVVMLights RelayCommand, que es muy similar al comando de delegado. – Agies

3

Bien - Creo que no hay la solución.

CommandBindings no son verificables tan fácil e introducen una dependencia de las clases WPF en el ViewModel que no es muy buena. Entonces no los usaría.

Tanto DelegateCommand como CommandSinkCommand (la solución de Josh Smith) son buenas formas de IMO. No son realmente diferentes y ninguno de ellos es superior al otro. Aunque, me di cuenta, la versión CommandSink no funciona siempre cuando el enrutamiento de comandos se vuelve más complejo (especialmente cuando se trata de plantillas de datos).

Incluso puede combinarlos: utilice DelegateCommand y, además, use la versión de JoshSmith para que pueda combinar las ventajas de ambos. Lo único que necesita son algunas clases de ayuda, no realmente difíciles de implementar.

Mucho más importante es la consistencia en su aplicación: si decidió lo que quiere usar, debe seguir de esta manera a través de toda su aplicación.

Cuestiones relacionadas