我正在构建一个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
}
}
我的问题是:
是否有更优雅的方法来为许多控件而不是大量的get / set代码引发PropertyChanged
事件?
有没有办法筹集1 PropertyChanged
个事件,涵盖包含多个控件的整个UserControl
而不是每个控件的单独事件?有没有比我正在尝试的更好的方法?
答案 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/