在许多控件上实现INotifyPropertyChanged的优雅方式

时间:2012-09-09 18:20:27

标签: c# wpf xaml

我正在构建一个WPF应用程序,我正在慢慢发现一些乐趣以及使用WPF的挫败感。我的最新问题涉及使用INotifyPropertyChanged

更新用户界面

我的应用程序堆叠了UserControls,每个UserControl包含多个控件,因此总共有数百个控件每秒更新一次,提供实时数据。为了更新所有控件,我正在使用类似于下面的内容,这些内容目前正在按预期工作。

namespace ProjectXAML
{
    public partial class ProjectX : UserControl, INotifyPropertyChanged
    {


#region Declare Getter/Setter with INotifyPropertyChanged groupx3

        private string m_group1Text1;
        public string group1Text1
        {
            get
            {
                return m_group1Text1;
            }
            set
            {
                m_group1Text1 = value;
                NotifyPropertyChanged("group1Text1");
            }
        }

        private string m_group1Text2;
        public string group1Text2
        {
            get
            {
                return m_group1Text2;
            }
            set
            {
                m_group1Text2 = value;
                NotifyPropertyChanged("group1Text2");
            }
        }

        private string m_group2Text1;
        public string group2Text1
        {
            get
            {
                return m_group2Text1;
            }
            set
            {
                m_group2Text1 = value;
                NotifyPropertyChanged("group2Text1");
            }
        }

        private string m_group2Text2;
        public string group2Text2
        {
            get
            {
                return m_group2Text2;
            }
            set
            {
                m_group2Text2 = value;
                NotifyPropertyChanged("group2Text2");
            }
        }

        private string m_group3Text1;
        public string group3Text1 
        { 
            get
            {
                return m_group3Text1;
            }
            set
            {
                m_group3Text1 = value;
                NotifyPropertyChanged("group3Text1");
            }
        }

        private string m_group3Text2;
        public string group3Text2
        {
            get
            {
                return m_group3Text2;
            }
            set
            {
                m_group3Text2 = value;
                NotifyPropertyChanged("group3Text2");
            }
        }

 #endregion

 #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        /// Notifies the property changed.
        private void NotifyPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
 #endregion

}
}

我的问题是:

  1. 是否有更优雅的方法来为许多控件而不是大量的get / set代码引发PropertyChanged事件?

  2. 有没有办法筹集1 PropertyChanged个事件,涵盖包含多个控件的整个UserControl而不是每个控件的单独事件?有没有比我正在尝试的更好的方法?

3 个答案:

答案 0 :(得分:3)

使用设计模式model view controler。所以模型会为你提出改变。与MVVM一起,控件将使用其依赖项对象查看更改并自动查看它们。

答案 1 :(得分:3)

严格参考你问题的这一部分......"有没有办法引发一个包含"的整个UserControl的PropertyChanged事件。

是的,您可以提出一个PropertyChanged通知,告知我对象上的所有属性都已更新。

使用:

NotifyPropertyChanged(null);

然后通知INotifyPropertyChanged的监听器,对象上的所有属性都已更改。

这通常不被使用......并且可能被滥用......并导致低效更新,例如如果你只是改变一些属性并使用它。

但如果你的对象中有很多属性,那么你可以争论使用它的情况,你总是在同一时间改变...并且你想要将大量的单个通知合并到1之后你修改了所有属性。

示例用例(即假设您以某种方式更新所有组):

void UpdateAllGroupTextProperties()
{
    group1Text1 = "groupA";
    group1Text2 = "groupA2";
    group2Text1 = "groupB";
    group2Text2 = "groupB2";
    group3Text1 = "groupC";
    group3Text2 = "groupC2";
    NotifyPropertyChanged(null);
}

答案 2 :(得分:3)

对于第1点,如果您使用的是VS 2012,则可以执行以下操作

private void SetProperty<T>(ref T field, T value, [CallerMemberName] string name = "")
{
    if (!EqualityComparer<T>.Default.Equals(field, value))
    {
        field = value;
        var handler = PropertyChanged;
        if (handler != null)
        {
          handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

然后您可以使用set属性方法,而无需硬编码属性的名称。

请注意,上述代码除以下链接外 http://danrigby.com/2012/03/01/inotifypropertychanged-the-net-4-5-way/