2011-04-27 11 views
21

Disculpe si el título es confuso pero realmente no sé cómo acortar mi pregunta. De todos modos, aquí va.MVVM - Enlazar directamente al objeto del modelo expuesto desde la VM o implementar una propiedad separada en la máquina virtual para acceder a las propiedades del modelo

Estoy usando WPF, Entity Framework y MVVM.

Actualmente, en mi modelo de vista, tengo una propiedad

public Model.Document Document {get;set;} //Model.Document is an EF Entity 

Luego, en XAML, que se unen a

<TextBox Text={Binding Path=Document.Title}/> 

título es, por supuesto, una propiedad en el modelo.

Ahora siguiente pregunta vino a mi mente: para separar el modelo de la vista, ¿no sería mejor si he añadido un alojamiento a la ViewModel como tan

public string Title 
    { 
     get { return Document.Title; } 
     set { Document.Title = value; } 
    } 

y luego ato así:

<TextBox Text={Binding Path=Title}/> 

¿Qué camino se recomienda?

Respuesta

11

Si echa un vistazo a How Data Binding References are Resolved, puede ver que puede haber problemas de rendimiento a considerar al decidir cómo exponer la propiedad a la que se va a vincular.

¿El Model.Document implementa la interfaz INotifyPropertyChanged? De lo contrario, recomendaría agregar una propiedad de Título a su modelo de vista e implementar INotifyPropertyChanged en su modelo de vista, de modo que cuando se modifique el título, se active el evento PropertyChanged para notificar a la vista.

Otro enfoque sería exponer el título en su modelo de vista como DependencyProperty ya que el tiempo de encuadernación y renderización es más rápido.

+0

que es un artículo bastante interesante (el cómo se resuelven las referencias de enlace de datos uno). –

+0

Artículo muy interesante de hecho. El ['EntityObject'] (http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject.aspx), desde el que se hereda el documento implementa 'INotifyPropertyChanged', por lo que se ha tenido cuidado de. Sin embargo, mi ViewModel también implementa INotifyPropertyChanged. Entonces realmente no debería importar de qué manera lo hago –

+0

La implementación de la Propiedad como DependencyProperty no es una opción ya que mi ViewModel no hereda de DependencyObject (¿cuál es un requisito que creo?). Por el contrario, hereda de la clase ViewModelBase del framework MVVM Light. –

2

Este último es la mejor manera de hacerlo, al menos IMO. No he visto realmente hecho de otra manera. El modelo de vista sirve como mediador entre la vista y el modelo, por lo que estos dos no deberían conocerse realmente.

Aquí hay un simple example.

2

Realmente depende de su situación. En el sentido más verdadero, la Vista solo debería interactuar con el Modelo de Vista. Pero ambos enfoques anteriores tienen sus ventajas.

Al exponer la propiedad del documento, no tiene que duplicar todas las propiedades a las que necesita acceder. Por lo tanto, si tiene numerosas propiedades o está utilizando algún tipo de reflejo (como mostrar el documento en un PropertyGrid), entonces esta forma es probablemente mejor.

Este último enfoque le da más control sobre el valor expuesto a la Vista. Por lo tanto, puede cambiar el título (es decir, eliminar espacios adicionales) antes de comprometerse con el modelo u otras acciones. Incluso puede intercambiar el documento, sin que la vista lo note (o incluso se preocupe).

1

No veo ningún problema con los enlaces de solo lectura a las propiedades del modelo cuyos valores no cambian.

Sin embargo, esas son dos cualidades realmente importantes.El enlace de lectura/escritura a las propiedades del modelo está tan plagado de problemas potenciales que, en lugar de analizar la situación de manera sobria, para ver si este es uno de los casos que no tiene ninguno, simplemente implementaría una propiedad en el modelo de vista y terminaría con eso. Y a menos que mi modelo admita la notificación de cambio, si lo necesito, lo que probablemente haga, tendré que implementarlo en el modelo de vista.

+1

¿Qué quiere decir que la vinculación a las propiedades de r/w está plagada de posibles problemas? ¿Tienes algunos ejemplos? –

1

que te pueden echar un vistazo a la aplicación de la muestraBookLibrary del WPF Application Framework (WAF). Utiliza el primer enfoque y aún sigue el patrón MVVM (separación de preocupaciones, unidad comprobable).

Esto simplifica ViewModels porque la vinculación utiliza la implementación INotifyPropertyChanged de las entidades. De lo contrario, debe sincronizar los cambios manualmente entre ViewModels.

Cuestiones relacionadas