【发布时间】:2016-10-20 19:37:37
【问题描述】:
在实现INotifyPropertyChanged 时,我一直不确定propertyName 的含义。所以通常你将INotifyPropertyChanged 实现为:
public class Data : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName = "") {
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
private string itsID;
public string ID {
get { return itsID; }
set {
if (itsID != value) {
itsID = value;
NotifyPropertyChanged("ID");
}
}
}
我一直不确定 NotifyPropertyChanged(string propertyName) 的 propertyName 参数。
- 可以是任意字符串(如上例中的“MyID”)吗?
- 或者.NET 是否使用反射将其与类中的属性对齐,因此它必须与属性名称完全匹配?
- 如果
propertyName与Property的名称不完全匹配,.NET 是否会将整个对象视为changed?
【问题讨论】:
-
只是一个安全提示:当你在做
if (PropertyChanged != null)时,尽量避免这种情况,因为在null之后检查PropertyChanged可能确实又是null。相反,更安全/更好的做法是先设置一个局部变量,然后再检查。例如var handler = PropertyChanged; if (handler != null) { handler()... // raise }- 或者从 C#6 开始,您可以使用新的“空条件运算符”:PropertyChanged?.Invoke(...)兼作null检查 和 一次调用。 -
这里解释得很好 (cs.colorado.edu/~kena/classes/5448/f12/presentation-materials/…),我认为这是执行所有这些实际跟踪的 .NET 源代码 (referencesource.microsoft.com/#System.Data.Services.Client/…)。 WPF 基本上订阅属性更改事件,然后使用事件参数,其中之一是您用于 ID 的字符串,例如
MyID,然后使用它来对控件进行更新。跨度>
标签: c# .net inotifypropertychanged