INotifyPropertyChanged 和 propertyName
INotifyPropertyChanged and propertyName
在实施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 是否使用反射将其与 class 中的 属性 对齐,因此它必须与 属性 的名称完全匹配?
- 如果
propertyName
与 Property
的名称不完全匹配怎么办,.NET 是否将整个对象视为 changed
?
如果您想准确匹配 属性 的名称,您可以使用名为 nameof
的新 C#6 功能。 nameof
功能可以回答您所有的问题,因为我们可以说使用 nameof
的主要优点一言以蔽之就是 重构 。 "refactoring" 是您根据问题查找的词:
NotifyPropertyChanged(nameof(ID));
例如 重命名 ID
也会更改 属性 的名称,否则会破坏编译,但以下不会:
NotifyPropertyChanged("ID")
它必须与 属性 的名称完全匹配。附带说明一下,您应该在调用 PropertyChanged 之前检查该值是否已实际更改,因为这是一个相对昂贵的调用(WPF 不会知道 属性 没有更改)。在VS2015中,还可以使用nameof运算符。
它本身并不是 .NET Framework 本身,几乎每个 PropertyChanged
订户(其中一些确实碰巧作为框架的一部分分发)假设您按预期使用界面, 通过发送 属性 名称。如果您发送 属性 MyID
已更改的通知,当另一个组件正在查看 属性 ID
时,它通常会看到通知,比较名称,然后总结 "this notification isn't for me".
在实施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 是否使用反射将其与 class 中的 属性 对齐,因此它必须与 属性 的名称完全匹配?
- 如果
propertyName
与Property
的名称不完全匹配怎么办,.NET 是否将整个对象视为changed
?
如果您想准确匹配 属性 的名称,您可以使用名为 nameof
的新 C#6 功能。 nameof
功能可以回答您所有的问题,因为我们可以说使用 nameof
的主要优点一言以蔽之就是 重构 。 "refactoring" 是您根据问题查找的词:
NotifyPropertyChanged(nameof(ID));
例如 重命名 ID
也会更改 属性 的名称,否则会破坏编译,但以下不会:
NotifyPropertyChanged("ID")
它必须与 属性 的名称完全匹配。附带说明一下,您应该在调用 PropertyChanged 之前检查该值是否已实际更改,因为这是一个相对昂贵的调用(WPF 不会知道 属性 没有更改)。在VS2015中,还可以使用nameof运算符。
它本身并不是 .NET Framework 本身,几乎每个 PropertyChanged
订户(其中一些确实碰巧作为框架的一部分分发)假设您按预期使用界面, 通过发送 属性 名称。如果您发送 属性 MyID
已更改的通知,当另一个组件正在查看 属性 ID
时,它通常会看到通知,比较名称,然后总结 "this notification isn't for me".