为类/结构的所有成员提升INotifyPropertyChanged?

时间:2011-01-13 15:27:49

标签: silverlight mvvm mvvm-light

所以我有一个像这样设置的项目

Class Dataclass
{
  var data
  var data;
  var data;
 }

class DataViewModel
{
   private Dataclass thing;

   public string thingPropertyName = "thing";
   public Dataclass Thing
   {
     get { return thing; }
     set { thing = value; RaisedPropertyChanged(thingPropertyName);}
   }
 }

所以这是我的问题:如果我通过ModelView类中的Thing字段绑定到子属性,如果类的任何成员发生更改,绑定就不会更新,只有当整个对象发生更改时,我相信是故意的。

如何解决这个问题,以便如果我对所包含的Dataclass的成员做了什么,我的绑定会正确更新?

我要看的第一件事是将子类的每个元素都包装到父类的属性中,如下所示:

public var Data
{
   get { return thing.Data; }
   set { thing.Data = value; RaisePropertyChanged(DataProperyName);}
}

这很有效,但是在初始化子类对象时仍然存在问题。我能看到的唯一解决方案是在初始化类时为每个元素手动调用RaisedPropertyName()。这似乎不是最佳的方式。我希望有更好的方法。感谢。

2 个答案:

答案 0 :(得分:4)

在大多数情况下,调用RaisePropertyChanged(null)(假设这最终调用相应的INotifyPropertyChanged事件委托调用null作为args结构中的属性名参数)将告诉所有绑定的侦听器刷新。

答案 1 :(得分:3)

如果您绑定到DataClass的属性,并希望刷新绑定(这最终是使用绑定的目标),那么这意味着您的DataClass必须实现INotifyPropertyChanged(其目的正是如此)。

如果您不希望DataClass实现INotifyPropertyChanged,则出于“图层”原因(例如:您不希望您的Data类实现与Views相关的问题),那么您的DataViewModel必须作为每个的传递你需要的财产。这是您提出的第二个解决方案。