4

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

我的应用程序堆叠了用户控件,每个控件都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. PropertyChanged有没有一种更优雅的方式来为大量控件而不是大量获取/设置代码引发事件?

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

4

3 回答 3

4

严格参考您问题的这一部分……“有没有办法引发 1 个 PropertyChanged 事件,覆盖整个 UserControl 包含”。

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

采用:

NotifyPropertyChanged(null);

然后这会通知 INotifyPropertyChanged 的​​侦听器对象的所有属性都已更改。

这通常不被使用......并且可能被滥用......并导致低效更新,例如,如果您只更改几个属性并使用它。

但是,如果您的对象中有很多属性,那么您可能会争论使用它的理由,无论如何您总是同时更改......并且您想将许多单独的通知折叠成 1 在您修改后引发所有属性。

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

void UpdateAllGroupTextProperties()
{
    group1Text1 = "groupA";
    group1Text2 = "groupA2";
    group2Text1 = "groupB";
    group2Text2 = "groupB2";
    group3Text1 = "groupC";
    group3Text2 = "groupC2";
    NotifyPropertyChanged(null);
}
于 2012-09-09T19:49:25.590 回答
4

对于第 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/的除外

于 2012-09-09T23:59:06.250 回答
3

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

于 2012-09-09T18:23:05.590 回答