我首先实现代码,MVC 模式并使用 Entity Framework 4.1。我把我的问题用粗体表示。
让我们假设(为简化起见)我有以下 POCO 对象(部门),并且我想知道一旦执行 contextDB.SaveChanges() 并对其进行更新,它何时会发生变化,因此我实现了以下内容:
public class Department : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(object sender, PropertyChangedEventArgs e)
{
PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, e);
}
}
[Key(), Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
private string name;
[Required]
public string Name
{
get
{
return this.name;
}
set
{
if (this.name== value)
{
return;
}
this.name= value;
this.NotifyPropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
private string personInCharge;
[Required]
public string PersonInCharge
{
get
{
return this.personInCharge;
}
set
{
if (this.personInCharge== value)
{
return;
}
this.personInCharge= value;
this.NotifyPropertyChanged(this,
new PropertyChangedEventArgs("PersonInCharge"));
}
}
}
我有 3 个项目(类库),用于 M(模型)、V(视图)和 C(控制器)。
从视图(V),用户生成和事件,例如,通过按下按钮添加一个部门,因此引用控制器(C)的视图调用控制器中的方法“添加”。
引用模型(M)的控制器(C)可以访问上下文,因为它实例化了从模型中的 dbContext 派生的类,并通过上下文更新实体“部门”,例如 dbContext.departments.add (新部门)。
当模型中的实体部门更新时,实体部门中的上述NotifyPropertyChanged被提出,但我的问题从这里开始,是:如何对视图说,嘿!实体部门已更改,因此应更新视图部门!
为了实现它,我实现了观察者模式,我的意思是视图部门有一个名为“更新”的方法,附加到模型维护的观察者集合上,因此模型在属性更改时迭代这个集合并调用每个视图的“更新”方法和视图更新。
我的问题是:我不知道如何从视图中订阅上述类部门中的事件 PropertyChanged,以便一旦部门 POCO 对象(上述类)中的属性发生更改,模型将迭代包含的观察者集合观察者附加,然后为附加到集合的每个视图(观察者)调用适当的“更新”方法。或者也许有另一种更好的方法来做到这一点,而不是对 POCO 对象使用 INotifyPropertyChanged?
我还看到使用 INotifyPropertyChanged 的问题,我的意思是,例如,每次添加一个部门时,视图将更新两次,因为 NotifyPropertyChanged 被引发两次,一次来自 Name 属性,另一个来自 PersonInCharge 属性。这里的另一个问题:如何只引发一次 NotifyPropertyChanged 事件而不是两次?