Pregunta

He comenzado a crear una aplicación de WPF MVVM. Parece un ingrediente vital para el modelo de vista es un montón de ICommands tener una forma imprecisa de permitir que el fin de interactuar con el modelo de vista.

Mi pregunta es, ¿por qué no puedo enlazar directamente a un método?

He utilizado la aplicación RelayCommand de Josh Smith, de ICommand que le permite inyectar delgates en un objeto ICommand, pero realmente, ¿hay alguna manera más fácil permitir un empuje botón para llamar a un método en el modelo de vista?

Soy nuevo en MVVM, creo que necesito un poco de iluminación

¿Fue útil?

Solución

No se puede vincular directamente a un método porque Button (por ejemplo) no tiene una propiedad que acepta un delegado. En cambio, tiene una propiedad de tipo Command ICommand. Un RelayCommand (también conocido como DelegateCommand) es sólo una ICommand que envuelve los delegados.

No veo ninguna razón técnica por la cual no sería posible para el fin de obligar a los métodos específicos en el modelo de vista a través de una extensión de marcado:

<Button Command="{ViewModelMethod SomeMethodName}"/>

Sin embargo, esto sería más lento y aumentaría el acoplamiento entre la vista y vista del modelo. Si la vista sólo conoce acerca de una propiedad en la vista del modelo de tipo ICommand, la ejecución de ese comando podría cambiar por completo (o métodos podría ser cambiado de nombre) sin la vista ser consciente.

Otros consejos

estoy completamente en desacuerdo.

La velocidad de invocación no es pertinente: Los comandos son las interacciones del usuario, que nunca requieren velocidad

.

El argumento acerca de acoplamiento está viciado también. ¿Cómo es que MyProperty {Binding} no está acoplando pero {ViewMethod MiMetodo} es?

requisito de tener especialmente diseñado 'Comandos' para ser envuelto alrededor de los métodos es una tonta. Comandos podría ser útil la aplicación bajo la cubierta, pero ya tenemos métodos en C # y su sustitución por algo grande y voluminoso no es correcto.

Y eso de MarkupExtension y encuadernación, es realmente difícil. Pero puede hacerse. En realidad, se hace, se puede echar un vistazo a methodCall proyecto en CodePlex: http://methodcallthing.codeplex.com/

Puede utilizar el enlace de elegir 'esto' para el método, y puede usar de unión a buscar argumentos. Y todos los que son en vivo, es decir, que se calcula en el momento en que se invoca el comando. Otra característica de la prima es de expulsión resultado de llamada al método, puede utilizar unión para eso también (OneWayToSource).

ICommand le da CanExecute, que es necesaria para el control de habilitación. Un delegado simple no lo hace. ICommand es el camino a seguir.

Al parecer, Microsoft necesita un comando a ser algo de primera clase, probablemente porque se sentían teniendo el CanExecute era necesario para la mayoría de aplicaciones. No estoy de acuerdo y creo que el CanExecute debería haber sido sólo otra DependencyProperty que le unen a una propiedad de nuestro modelo de vista, pero bueno, ¿qué sé yo?

Es posible que también pensaban que había una necesidad de separar la ejecución de un comando del DataContext del control. Una vez más, esto parece innecesario para mí, porque la lógica debe vivir cerca de los datos que se va a operar, ya que es un principio fundamental de la OO.

Personalmente evito el uso de comandos en MVVM debido al desorden que hay que crear para ponerlas en práctica. Acabo de dejar que los acontecimientos de código subyacente de delegado de la vista hasta el modelo de vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top