代码之家  ›  专栏  ›  技术社区  ›  rrhartjr

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

  •  2
  • rrhartjr  · 技术社区  · 15 年前

    漂亮的样板:

    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个财产变更事件有点不靠谱。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Community CDub    8 年前

    可以使用参数引发PropertyChangedEvent 字符串。空 here

        2
  •  0
  •   jfs    15 年前

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

    1. 创建一个类来封装PropertyChanged事件的触发,这样就不必编写太多样板代码。您只需声明PropertyChanged事件并使用该类来调用它。
    2. 如果存在相互依赖的属性。为独立属性创建一个处理程序,以便每次更改时都可以调用依赖属性。例如,您可以为TotalWidgets设置一个内部处理程序,以便在它更改时,您可以相应地更改ScaledWidgets。

    为什么要写100个PropertyChanged事件?也许没必要,问题出在别的地方。