Pregunta

Me acaba de empezar a experimentar con el de Laurent Bugnion MVVM Light Toolkit . Creo que voy a realmente te gusta, pero tengo un par de preguntas.

Antes de llegar a ellos, me explico dónde vengo. Actualmente utilizo una combinación de MVVM Fundación de Josh Smith y otro proyecto en CodePlex llamado MVVM Toolkit . Yo uso ObservableObject y Messenger de la Fundación MVVM 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 una CommandManagerHelper que utiliza referencias débiles a evitar pérdidas de memoria.

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

  1. ¿Por qué MVVM Light RelayCommand uso en lugar de DelegateCommand? Es el uso de referencias débiles en un ICommand innecesaria o no recomendados 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 debido view-modelos no son los únicos objetos que necesitan para poner en práctica INotifyPropertyChanged. Por ejemplo, digamos que usted tiene una cuadrícula de datos que se une a una lista de objetos Person. Si alguna de las propiedades en Person puede cambiar mientras el usuario está viendo la cuadrícula de datos, Person tendría que aplicar INotifyPropertyChanged. (Me di cuenta que si Person es usar algo como LinqToSql autogenerado, es probable que ya implementar INotifyPropertyChanged, pero hay casos en los que necesito para hacer versiones específicas para la vista de los objetos del modelo entidad, por ejemplo, porque necesito incluir un comando de soportar una columna botón en una cuadrícula de datos.)

Gracias.

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

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

¿Fue útil?

Solución

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

De acuerdo con El sitio de CodePlex Toolkit MVVM Light (en "Elevar el caso CanExecuteChanged manualmente"), el CommandManager ha sido eliminado por completo.

En cuanto a Observable Object, he añadido un elemento para el control de incidencias en el sitio CodePlex.

Otros consejos

También puede considerar Catel . Es compatible con una DataObject (genéricos y no genéricos) que el apoyo exactamente lo que está buscando (un objeto que implementa INotifyPropertyChanged, IDataErrorInfo, y mucho más). A continuación, el ViewModelBase se deriva de la muy poderosa clase DataObjectBase, para que pueda utilizar el DataObjectBase de objetos de datos, y la ViewModelBase de modelos de vista.

También te salva de la creación de mensajeros ya que sólo tiene que utilizar el atributo interestedin en un modelo de vista para recibir notificaciones de cambio de otro modelo de vista.

Tanto 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.

El DelegateCommand define un separada clase aparte de la vista del modelo. El ObservableObject es una instancia de un separada clase aparte de la vista del modelo. Esta no es una regla, pero las preferencias personales del momento: el Modelo Vista es suficiente para mí como un contenedor para la lógica de negocio, en relación a las imágenes. Esto puede traicionar mi preferencia por MVVM Light --- la cual no me parece que carece por el momento.

no estoy muy seguro de lo que está pasando en el ejemplo cuadrícula de datos. Lo que puedo decir es que la cuadrícula de datos no es muy flexible --- Sin embargo, en WPF, la DataGridTemplateColumn puede declarativa se unen una vista de modelo a una vista (por ejemplo, un usuario de Control). Así que tal vez este sentido marcas:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate DataView="{x:Type m:YourViewModelForButton}">
        <v:YourViewWithButton/>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top