【问题标题】:Raising INotifyPropertyChanged for all members of a class/struct?为类/结构的所有成员提高 INotifyPropertyChanged?
【发布时间】:2011-01-13 15:27:48
【问题描述】:

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

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() 。这似乎是一种不太理想的方法。我希望会有更好的方法。谢谢。

【问题讨论】:

  • 漂亮的头像(让我想起了别人的):)

标签: silverlight mvvm mvvm-light


【解决方案1】:

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

【讨论】:

  • 谢谢,我不知道 INotifyPropertyChanged 会像这样运行。
  • @Brandorf,不能保证,因为并非所有听众都会正确解释 null。它绝对适用于 WPF 上下文中的 DependencyProperty 绑定,但其他客户端可能订阅 NotifyPropertyChanged 并且无法正确处理 null。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    相关资源
    最近更新 更多