【问题标题】:WPF automatically updates from INotifyPropertyChanged?WPF 从 INotifyPropertyChanged 自动更新?
【发布时间】:2014-01-12 13:53:33
【问题描述】:

WPF 框架是否会自动获取 UI 中 INotifyPropertyChanged 派生类型到 Bindings 的更新?

还是我必须手动完成?

【问题讨论】:

    标签: c# wpf inotifypropertychanged


    【解决方案1】:

    如果你正确实现INotifyPropertyChanged,它是自动的。

    【讨论】:

      【解决方案2】:

      半手动:-)

      当您实现“INotifyPropertyChanged”时,您将实现那些方法(通常实现相同)

          #region INotifyPropertyChanged
          protected void RaisePropertyChanged(string propertyName)
          {
              OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
          }
          protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
          {
              if (PropertyChanged != null) { PropertyChanged(this, e); }
          }
          public event PropertyChangedEventHandler PropertyChanged;
          #endregion
      

      之后,当您的某个属性发生更改时,您需要使用更改的属性名称调用“RaisePropertyChanged”。通常在该属性的设置器中

      【讨论】:

      • 一个不是从接口派生的。一个实现一个接口。次要但值得一提,因为 c# 支持多重继承。
      • 太棒了!有趣的提示,如果您将属性名称字符串留空,wpf 会刷新与该对象的所有绑定:D
      • 关于这个问题,我认为你的答案应该是“自动”而不是“半手动”。 (INotifyPropertyChanged实现 是(作为任何实现,包括依赖属性的实现)手动,但是从 INotifyPropertyChanged 实现类型“获取更新”与获取更新一样自动来自具有依赖属性的DependencyObject
      • 对我来说还不清楚。如果我将 MyOnPropChange(s, args){ OnPropertyChanged(args.Name) } 绑定到 PropertyChanged eventHandler,这是否会自动更新我的更改视图,而无需调用“手动”OnPropertyChanged。我问是因为我不想手动将它添加到每个集合中
      【解决方案3】:

      是的,它是半手动的,

          string _tText;
          public string Text
          {
              get { return _tText; }
              set
              {
                  _tText = value;
                  OnPropertyChanged("Text");
              }
          }
      

      一旦属性设置了某个值,这里的属性就会更改显示调用。 OnPropertyChanged("Text");

      【讨论】:

      • 这是对您的视图模型实现的调用,而不是 INotifyPropertyChanged 的事件。
      • 这种实现接口的方式可能有风险。除非您检查新值和旧值是否实际上不同,否则最终可能会出现间接无限递归。
      • @O.R.Mapper - 引发事件如何以无限递归结束?你能详细说明一下吗?
      • @Gusdor:这个代码块是用上面的答案扩展的......有INotifyPropertyChanged接口的实现,我提到了属性改变的方式。
      • @O.R.Mapper:可能是对的,但在 WPF 中,如果启动相同的值,框架本身会负责递归。所以这取决于将要使用它的情况。除非我们在引发事件之前检查新值是否不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2011-03-05
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多