viewmodelbase tutorial patron microsoft instancelocator español ejemplo docs wpf entity-framework mvvm

wpf - tutorial - 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.



xamarin forms mvvm ejemplo (5)

Lo siento si el título es confuso pero realmente no sé cómo acortar mi pregunta. De todos modos, aquí va.

Estoy usando WPF, Entity Framework y MVVM.

Actualmente, en mi ViewModel, tengo una propiedad

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

Luego, en XAML, me ato a

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

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

Ahora me viene a la mente la siguiente pregunta: para separar el Modelo de la Vista, ¿no sería mejor si añadiera una propiedad al ViewModel como tal?

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

y luego unir así:

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

¿Qué camino se recomienda?


Esta última 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 example simple.


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

Esas son dos calificaciones realmente importantes, sin embargo. 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.


Puede echar un vistazo a la aplicación de ejemplo BookLibrary 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 el enlace utiliza la implementación INotifyPropertyChanged de las entidades. De lo contrario, debe sincronizar los cambios manualmente entre ViewModels.


Realmente depende de tu 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.

El último enfoque le da más control sobre el valor expuesto a la Vista. De modo que 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).


Si echa un vistazo a cómo se resuelven las referencias a la vinculación de datos , puede ver que puede haber problemas de rendimiento a considerar al decidir cómo exponer la propiedad a la que se va a vincular.

¿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 cambie 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.