【问题标题】:INotifyPropertyChanged and consistency - when to raise PropertyChanged?INotifyPropertyChanged 和一致性 - 何时提高 PropertyChanged?
【发布时间】:2014-05-13 08:46:10
【问题描述】:

我有一个实现INotifyPropertyChanged 的类。它有两个属性,其值彼此相关,例如,一个人的名字和姓氏。如果一个属性被更新,另一个属性也需要更新。为了传达这一点,我将 setter 设为私有并添加了一个公共方法来同时更改这两个属性。

我的问题是关于何时引发 PropertyChanged 事件是否有任何规则或约定?我想延迟引发这两个属性的事件,直到状态完全更新并且我的对象的状态是一致的。但是,我不知道这是否会令人惊讶,从而给我的代码的用户带来麻烦,或者可能会在某处混淆某些库代码。

更新

再次查看documentation 发现以下内容:

PropertyChanged 事件可以通过使用 null 或 String.Empty 作为 PropertyChangedEventArgs 中的属性名称来指示对象上的所有属性都已更改。

这可能会解决我的特定问题,尽管如果对象上有许多属性,它似乎不是一个通用的解决方案。

但是,我的问题仍然有效:我们是立即提出 PropertyChanged 还是在某些情况下我们可以/应该稍等片刻。

【问题讨论】:

  • 您只需记住 PropertyChanged 不需要在 setter 中引发。它们可以从任何需要的地方升起。我认为很明显,您应该在该公共方法的最后引发两个属性的事件。

标签: .net inotifypropertychanged


【解决方案1】:

当您的对象处于一致状态时,您应该引发PropertyChanged 事件。如果更新两个属性,则应在更新两个属性后引发事件。 “稍等一下”实际上没有意义 - 您是否打算使用计时器来等待一小段时间(比如 100 毫秒)?

取决于您的属性更改通知希望看到一致的对象。例如:

public void SetFullName(String fullName) {
  // Naïve implementation.
  var names = fullName.Split(new[] { ' ' }, 2);
  FirstName = names[0];
  LastName = names[1];
  OnPropertyChanged("FirstName");
  OnPropertyChanged("LastName");
}

【讨论】:

  • 呵呵,“稍等一下”我当然是指设置两个属性,然后只引发事件,就像你建议的那样。谢谢你的回答。
猜你喜欢
  • 2016-04-17
  • 2015-09-24
  • 2011-11-18
  • 2011-12-19
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
相关资源
最近更新 更多