MVVM子属性更改检测

时间:2011-10-18 16:51:36

标签: mvvm entity

我的问题如下:

我正在使用MVVM模式,我想知道如何检测子属性的更改。

我有一个文本框:

<TextBox Name="Descripcion" Text="{Binding AccionActual.Descripcion,Mode=TwoWay}" />

在ViewModel中我有属性:

Accion _accionActual;
public Accion AccionActual
    {
        get { return _accionActual; }
        set
        {
             _accionActual = value;
             RaisePropertyChanged("AccionActual");
        }
    }

Accion实体定义是:

public partial class Accion : Entity
    {
        public Accion()
        {

            this.AccionesDocumentos = new HashSet<AccionDocumento>();

        }

        public int IdAccion { get; set; }
        public int IdEmpleado { get; set; }
        public string Descripcion { get; set; }
        public string DescripcionDetalle { get; set; }
        public bool Finalizada { get; set; }
        public Nullable<int> IdExpediente { get; set; }
        public Nullable<int> IdOrdenTrabajo { get; set; }
        public bool Facturable { get; set; }
        public Nullable<short> GestComAlbaranAño { get; set; }
        public Nullable<short> GestComAlbaranEmpresa { get; set; }
        public Nullable<int> GestComAlbaranNumero { get; set; }
        public bool Facturado { get; set; }
        public bool ComputarHorasACliente { get; set; }
        public string DescripcionInterna { get; set; }

        public virtual Aplicacion Aplicacione { get; set; }
        public virtual AplicacionModulo AplicacionesModulo { get; set; }
        public virtual Cliente Cliente { get; set; }
        public virtual ClienteContacto ClientesContacto { get; set; }
        public virtual Empleado Empleado { get; set; }
        public virtual Expediente Expediente { get; set; }
        public virtual OrdenTrabajo OrdenesTrabajo { get; set; }
        public virtual ICollection<AccionDocumento> AccionesDocumentos { get; set; }


    }

我可以在ViewModel中为Accion的每个属性创建一个属性,但有没有办法接收更改而无需为Accion的每个属性创建属性?

2 个答案:

答案 0 :(得分:2)

您有两个选择 - 修改Accion类以实现INotifyPropertyChanged或创建一个ViewModel包装器来执行此操作。

你认为这取决于你 - 做最适合你的事情。有a question on the merits of doing it in the ViewModel vs Model class here

您可以通过查看类似notifypropertyweaver之类的内容来执行此操作的手动过程 - 尝试使用Google查找INotifyPropertyChanged面向方面编程。有一个Stackoverflow question on it here

答案 1 :(得分:0)

ViewModel的这种冗余双重包装是经典MVVM中的常见问题,也让我疯狂。

您有几种选择:

  1. 让您的实体实施INotifyPropertyChanged并使用AccionActual属性将实体公开给View。
  2. 将您的实体完全隐藏在相应的ViewModel对象后面,并仅将这些属性添加到View中 实际 所需的ViewModel。引入一个聪明的更改通知基础结构,通知您的ViewModel模型中的更改并相应地在ViewModel中引发PropertyChanged。这个“更改通知基础结构”可能是EventAggregator,也许您可​​以通过某种批量/元更新来逃避(例如,当您收到事件“实体已更改”时,为ViewModel中的所有相关属性引发NotifyPropertyChanged。