2011-01-04 17 views
5

Acabo de comenzar a experimentar con Laurent Bugnion's MVVM Light Toolkit. Creo que realmente me va a gustar, pero tengo un par de preguntas.MVVM Light Toolkit - RelayCommands, DelegateCommands, y ObservableObjects

Antes de que llegue a ellos, déjenme explicar de dónde vengo. Actualmente uso una combinación de MVVM Foundation de Josh Smith y otro proyecto en Codeplex llamado MVVM Toolkit. Yo uso ObservableObject y Messenger de MVVM Foundation y DelegateCommand y CommandReference de MVVM Toolkit.

El único solapamiento real entre Fundación MVVM y MVVM Tookit es que los dos tienen una implementación para ICommand: Fundación MVVM tiene RelayCommand y MVVM Tookit tiene DelegateCommand. De estos dos, DelegateCommand parece ser más sofisticado. Emplea un CommandManagerHelper que utiliza referencias débiles para evitar fugas de memoria.

Con eso dicho, aquí están mis preguntas:

  1. ¿Por qué utiliza MVVM Light RelayCommand en lugar de DelegateCommand? ¿El uso de referencias débiles en un ICommand es innecesario o no recomendado por alguna razón?

  2. ¿Por qué no hay ObservableObject en MVVM Light? ObservableObject es básicamente la parte de ViewModelBase que implementa INotifyPropertyChanged, pero es muy conveniente tener como una clase separada porque los modelos de vista no son los únicos objetos que necesitan implementar INotifyPropertyChanged. Por ejemplo, supongamos que tiene un DataGrid que se une a una lista de objetos Person. Si alguna de las propiedades en Person puede cambiar mientras el usuario está viendo DataGrid, Person necesitaría implementar INotifyPropertyChanged. (Me doy cuenta de que si Person se genera automáticamente usando algo como LinqToSql, probablemente ya implemente INotifyPropertyChanged, pero hay casos en los que necesito hacer versiones específicas de vista de objetos del modelo de entidad, por ejemplo, porque necesito incluir un comando para admite una columna de botón en un DataGrid).

Gracias.

P.S. Aquí está el código para DelegateCommand del MVVM Toolkit:

https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU

Respuesta

4

Parece que la cuestión planteada por la primera pregunta ha sido resuelto en la última versión:

Según The MVVM Light Toolkit Codeplex site (en "Elevar el caso CanExecuteChanged manualmente"), el CommandManager ha sido eliminado por completo.

En cuanto a Observable Object, he agregado an item to the Issue Tracker en el sitio de Codeplex.

+0

'ObservableObject' se ha implementado también ahora. – devuxer

0

Ambos de sus preguntas sugieren fuertemente a mí que usted prefiere usar algo más que el concepto Ver Modelo para definir la lógica de negocio.

DelegateCommand define una clase separada aparte del Modelo de visualización. El ObservableObject es una instancia de una clase separada de, aparte del modelo de vista. Esta no es una regla, sino una preferencia personal del momento: el modelo de vista es suficiente para mí como un contenedor para la lógica de negocios, en relación con las imágenes. Esto puede delatar mi preferencia por MVVM Light --- que no me falta en este momento.

No estoy seguro de lo que está sucediendo en el ejemplo de DataGrid. Lo que puedo decir es que DataGrid no es muy flexible; sin embargo, en WPF, el DataGridTemplateColumn puede vincular declarativamente un Modelo de Vista a una Vista (por ejemplo, un Control de Usuario).Así que tal vez esto tiene sentido:

<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate DataView="{x:Type m:YourViewModelForButton}"> 
     <v:YourViewWithButton/> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 
+0

'RelayCommand' es también una clase separada. También lo es 'ViewModelBase'. En cuanto a mi ejemplo de DataGrid, podría ser solo una cuestión de terminología. Pienso en * view-models * en MVVM como algo que vincula a Views a través del DataContext. Pero también creo que puede tener modelos de vista para objetos de dominio (es decir, entidades). Por ejemplo, 'Persona' podría tener una propiedad' DateOfBirth'. 'PersonViewModel' podría tener propiedades adicionales, como' Age', 'IsSelected' (para usar con una columna de casilla de verificación DataGrid), y' ToggleSelectionCommand' (para usar con una columna de botón DataGrid). – devuxer

+0

@DanM Usualmente mis objetos de dominio son parte del modelo de vista. Por ejemplo, en su caso, tendría una icollection , propiedad de propiedad seleccionada, luego tendría las propiedades de la persona como propiedades separadas vinculadas a la persona seleccionada. – ecathell

0

También puede considerar Catel. Admite un DataObject (genérico y no genérico) que admite exactamente lo que está buscando (un objeto que implementa INotifyPropertyChanged, IDataErrorInfo y mucho más). Entonces, ViewModelBase se deriva de la poderosa clase DataObjectBase, por lo que puede usar DataObjectBase para objetos de datos y ViewModelBase para modelos de vista.

También le ahorra la creación de mensajeros, ya que puede simplemente usar el atributo InterestedIn en un modelo de vista para recibir notificaciones de cambio de otro modelo de vista.

Cuestiones relacionadas