2009-06-04 12 views
18

Al crear una aplicación WPF con el patrón MVVM, parece que tengo para reunir las herramientas necesarias a mí mismo incluso comenzar el evento más rudimentaria manipulación, por ejemplo,¿Por qué los eventos y comandos en MVVM no están soportados por WPF/Visual Studio?

  • AttachedBehaviors que recibo de here
  • DelegateCommands que recibo de here

Ahora estoy en busca de alguna manera de controlar el evento itemSelected en un ComboBox y estoy recibiendo sugerencias de trucos y soluciones para hacer esto (utilizando un disparador XAML o tener otros elementos vinculados al elemento seleccionado, etc.). Bien, puedo seguir por este camino, pero parece estar reinventando la rueda. Sería bueno tener un comando ItemSelected que puedo manejar en mi ViewModel.

Me estoy perdiendo algún conjunto de herramientas estándar o es que cada uno haga MVVM con WPF, básicamente, la construcción y la elaboración de su propia colección de herramientas sólo para que puedan realizar las tareas de plomería más simples con los eventos y los comandos, las cosas que tienen solamente una unir líneas en código subyacente con un Click = "eventHandler"?

+7

Tengo que reconocer que WPF realmente echa de menos un conjunto de características para MVVM ... Sería bueno si Microsoft pudiera proporcionar algún tipo de juego de herramientas "oficial" de MVVM. –

Respuesta

7

Según Josh Smith de article sobre MVVM, se dio a conocer al mundo en octubre de 2005 sobre John Gossman's blog.

A partir de entonces, diría que tomaron otros 2 o 3 años para que WPF/MVVM realmente despegara y fuera aceptado por la comunidad, para entonces ya era demasiado tarde para actualizar WPF y soportar los problemas con MVVM. También diría que WPF creó MVVM, por lo que parece que WPF tiene un cambio para admitir MVVM.

Por último, haciendo WPF no todo el mundo utiliza MVVM, por lo que la API debe ser compatible con el uso estándar de eventos etc

Por lo tanto, para responder a su pregunta, sí todo el mundo está actualmente poniendo su propio conjunto de herramientas en conjunto como el " el soporte oficial solo proporciona el marco DelegateCommands en este momento.

+2

lol, me encanta esta idea de "desvelar" un "patrón" como si fuera un producto – Schneider

+2

Es una pena que Microsoft no publique algo para MVVM explícito como lo hicieron con ASP.NET MVC. – Kelly

0

Tome un vistazo a esta plantilla de proyecto MVVM para VisualStudio.

http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx

Con esta plantilla se obtiene diversas clases DelegateCommand que cubren diferentes necesidades de ICommands, y una clase CommandReference que ayuda con las asociaciones de teclas.

Es un buen comienzo ...

+0

sí, eso es lo que he vinculado anteriormente a DelegateCommands, tomé ese proyecto, hice algunos cambios y agregué AttachedBehaviors y se me ocurrió esta plantilla de MVVM http://tanguay.info/web/index.php?pg=codeExamples&id=195 que Uso cuando hago MVVM, pero aún no es suficiente cuando quiero algo tan simple como, por ejemplo, manejar un evento ItemSelected en un Combobox. Seguiré añadiendo a esto cuando obtenga las herramientas de MVVM, pero sería bueno encontrar otros intentos en colecciones como esta que extiendan la plantilla MVVM VS. –

2

Becuase MVVM se "inventó" mucho después de WPF ... por lo que las piezas grandes del rompecabezas MVVM no forman parte del marco WPF.

No sólo eso, sino que en sí MVVM fue declarado un "patrón" antes de que fuera probada/practica en el mundo real. Lo cual es todo lo contrario de lo que se trata con los patrones: por lo general, se detectan y documentan después de muchos años de uso exitoso por parte de muchas personas diferentes.

Un tipo viene con un patrón no hace un maquillaje patrón.

+0

No podría estar más de acuerdo. Hay una prisa por estar en el vagón de banda de patrones, y en el caso de MVVM como parte de XAML no estoy convencido. Necesitaría ver un código de grado de producción serio. –

+2

A menos que sea Jon Skeet, y el patrón en cuestión es el de patadas en el trasero. – Alan

16

Tiene razón acerca de la complejidad de los comandos.Intento seguir el patrón M-V-VM lo más cerca posible, pero no puedo justificar soluciones sofisticadas solo para manejar un simple evento de usuario.

En mi opinión, está bien manejar un evento de usuario en la Vista si eso simplifica enormemente su código. Si maneja un evento de usuario en la Vista, el código subyacente de su Vista debería llamar inmediatamente a un método en ViewModel. De esta manera, todavía conservas tu lógica en el modelo de vista ... solo tienes un pequeño código de fontanería (controlador de eventos) en la vista. Sé que los puristas de M-V-VM piensan que no debería haber código en el código subyacente de View, pero a veces tiene más sentido permitir un código repetitivo simple como un controlador de eventos. Recuerde, es posible que otros tengan que leer/modificar su código en el futuro y es mucho más fácil entender un controlador de eventos que un DelegateCommand.

+6

+1 por ser un programador pragmático. Si reenvía las llamadas desde los métodos de manejo de eventos en el código subyacente, tiene la separación de las preocupaciones sin necesidad de soluciones temporales sofisticadas. – dthrasher

+0

+1 Punto válido: preferiría este enfoque cualquier día que escribir código redundante solo para convertir eventos en comandos. –

+0

FWIW, codebehind es generalmente más simple y fácil cuando tienes un solo comando en un solo lugar que solo necesita ejecutarse. Los comandos comienzan a verse más atractivos cuando necesita tener un CanExecute también (aunque aún no es esencial, ayuda a agrupar la lógica más que la alternativa). Donde los Comandos realmente se vuelven superiores es cuando tiene la misma acción en múltiples lugares (botón/menú/barra de herramientas/etc.) o si quiere decorar de forma global comportamientos adicionales como el registro de IU o los permisos de usuario. Pero si su caso de uso es simple, puede que no valga la pena. – Miral

3

Me alegro de saber que no soy el único que cree que las implementaciones dominantes son overkill. La vinculación de datos parece tener un buen soporte, pero durante semanas he estado dando golpes en mi cabeza tratando de entender los enlaces de comando para cosas que no sean botones y elementos que heredan de él.

Gracias por publicar esta pregunta. Creo que a partir de ahora voy a manejar todos los eventos en la capa de vista con un redireccionamiento a las funciones del modelo de vista. Creo que así es como enseñaron MVVM básico en uno de los cursos de 2 días de XAMLFest de Microsoft. ¡Suficientemente bueno para mi!

Cuestiones relacionadas