如何更新绑定,特别是对于派生值?

时间:2010-06-07 01:59:42

标签: c# .net wpf data-binding

我正在使用一些使用INotifyPropertyChanged接口的CLR对象,并使用PropertyChanged函数在WPF绑定中进行更新。

漂亮的样板:

protected void RaisePropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后属性:

    private double m_TotalWidgets = 0;
    public double TotalWidgets
    {
        get { return m_TotalWidgets; }
        set 
        { 
            m_TotalWidgets = value;
            RaisePropertyChanged("TotalWidgets");
        }
    }

有更好的方法来更新派生值甚至整个类吗?

说我有一个计算值:

    public double ScaledWidgets
    {
        get 
        { 
            return TotalWidgets * CONSTANT_FACTOR;
        }
    }

当TotalWidgets更新时,我必须触发ScaledWidget的PropertyChanged,例如:

        set 
        { 
            m_TotalWidgets = value;
            RaisePropertyChanged("TotalWidgets");
            RaisePropertyChanged("ScaledWidgets");
        }

有更好的方法吗?是否可能“使整个对象无效”,特别是如果有很多派生值?我认为发起100场PropertyChanged事件会有点蹩脚。

2 个答案:

答案 0 :(得分:3)

您可以使用参数 string.empty null 来引发PropertyChangedEvent。然后,对象的所有属性都“无效”。查看我的帖子here

答案 1 :(得分:0)

我不知道是否有更好的方法,但我可以提出两点建议:

  1. 创建一个封装PropertyChanged事件触发器的类,这样您就不必编写大量的样板代码。您只需要声明PropertyChanged事件并使用该类来调用它。
  2. 如果存在彼此依赖的属性。为独立属性创建一个处理程序,以便每次更改时都可以调用依赖属性。例如,您可以拥有TotalWidgets的内部处理程序,以便在更改时,您可以相应地更改ScaledWidgets。
  3. 为什么要写100个PropertyChanged事件?也许这不是必要的,问题出在其他地方。