5

Estoy escribiendo una aplicación de escritorio en C# usando el patrón MVVM con un modelo de Entity Framework. Tiendo a usar DependencyProperties en mis máquinas virtuales y he llegado (generalmente) a preferir este sistema a implementar INotifyPropertyChanged. Me gustaría mantener las cosas consistentes. Mi máquina virtual accede a las entidades en el modelo y he logrado mantener las cosas bastante separadas: la vista no tiene ningún conocimiento de la máquina virtual, excepto los nombres de comandos y de enlace, y el modelo tiene conocimiento de la máquina virtual.Usando DependencyProperty en ViewModel con Entity Framework

Usando INotifyPropertyChanged en la VM, parece bastante fácil de actualizar las entidades del modelo:

public string Forename 
    { 
     get { return CurrentPerson.Forename; } 
     set 
     { 
      if (Forename != value) 
      { 
       CurrentPerson.Forename = value; 
       NotifyPropertyChanged("Forename"); 
      } 
     } 
    } 

... donde CurrentPerson es un objeto Person de auto-creada por el Entity Data Model. Por lo tanto, no hay ningún campo privado creado específicamente para almacenar el nombre.

Con DependencyProperties, parece que tendría que crear un DP, agregar la Propiedad predeterminada, usar GetValue y Setvalue y luego usar PropertyChangedCallback para actualizar la entidad de CurrentPerson. Llamar a una devolución de llamada en esta situación parece estar agregando sobrecarga por el hecho de ser consistente con mis otras máquinas virtuales.

La pregunta es, por tanto, si uno u otro de estos métodos es la forma en que debería hacer las cosas? En este caso, ¿debería usar DependencyProperty o INotifyPropertyChanged? Una cosa que debe señalarse es que este será potencialmente un proyecto a gran escala (con complementos y una gran cantidad de accesos de bases de datos desde diferentes máquinas) y que todo debería ser realmente reutilizable, y los módulos como "desconectados", como sea posible. .

+0

¿Qué es un beneficio del uso de las propiedades de dependencia a la vista de modelo? En otras palabras, qué valor adicional trae 'INotifyPropertyChanged' no ofrece. –

+0

Estoy buscando una buena velocidad y las bonitas características de encuadernación que vienen con los DP. Tenga en cuenta que estoy vinculando directamente a los DP con XAML en mi vista. También es probable que haya cambios frecuentes en el valor de la propiedad. De las referencias que he encontrado anteriormente, para la velocidad con enlace, DP son el camino a seguir. También hay consistencia con el resto de mi diseño. Sin embargo, nada de esto es bueno si es negado por todas las devoluciones de llamada que se realizan con enmiendas separadas a los objetos de la Entidad. –

Respuesta

2

Recomendaría usar INotifyPropertyChanged en lugar de DependencyProperty. La razón principal por la que me mantengo alejado de DependencyProperty en ViewModels es porque DependencyProperty se encuentra en WindowsBase.dll. Esto lo vincula demasiado a la interfaz de usuario de Windows (al menos en mi humilde opinión).

El uso de INotifyPropertyChanged es mucho más fácil de mantener ya que permite que los diversos complementos lo implementen de la manera que desean. Si fuerza Propiedades de dependencia, todos los modelos de vista deben heredar de DependencyObject.

Consulta este artículo para más detalles sobre el uso de INotifyPropertyChanged y DependencyProperty: http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html

Otra respuesta de apoyo: https://stackoverflow.com/a/783154/27669

+0

Gracias. Creo que INotifyPropertyChanged va a ser el camino a seguir, aunque con las diversas salvaguardas para utilizar "Magic Strings" en INotifyPropertyChanged, todavía encuentro que DP es más elegante. Las dos razones principales por las que vengo a este punto de vista son: 1) Duplicación de estado con DP y 2) El hecho de que a veces necesito cambiar el estado completo del objeto, y simplemente puedo hacer esto con PropertyChanged (nulo). Gracias por la respuesta y las referencias. –

+0

El acoplamiento a la IU de Windows puede ser un problema MAYOR. Solo se arregló un proyecto donde se usaron los mismos dlls para un servicio web pero la Propiedad de Dependencia insistió en que se ejecuta en el subproceso de UI que es bastante complicado en un servicio web multiproceso.Esta flexibilidad arquitectónica (es decir, la falta de acoplamiento estrecho con la GUI de Windows en las Entidades Dlls) es mucho más importante que la elegancia para la GUI. – user1496062