在用 C# 编写自定义依赖属性时,一个相当常见的包装器类似于:
public string Surname
{
get
{
return this.GetValue(SurnameProperty) as string;
}
set
{
this.SetValue(SurnameProperty, value);
}
}
现在,当使用 NotifyPropertyChanged 系统时,我通常会在实际提交值并调用 OnPropertyChanged 之前检查“设置” block 中的值是否已更改。我应该对依赖属性做同样的事情吗?即:
set
{
if(this.GetValue(SurnameProperty) != value)
this.SetValue(SurnameProperty, value);
}
...或者这是完全不必要的并且已经由 CLR 处理的事情?我在 MSDN 上看到的所有示例在调用 SetValue 之前都懒得做任何检查。非常感谢。
最佳答案
简短的回答是,框架已经处理好了。
实际上,根据 Adam Nathan 的“Windows Presentation Foundation”,XAML 编译器在编译时依赖于属性变形器。但是,.NET 属性包装器实际上在运行时在 XAML 中被绕过。因此,您实际上应该避免在 GetValue/SetValue 之外添加任何类型的逻辑。您在 setter 中添加的任何逻辑只有在您显式调用该属性时才会执行。但是,如果您在 XAML 中绑定(bind)该属性,运行时将跳过它。如果您的 setter 中有错误,您可能需要一些时间才能弄清楚。如果你手里拿着那本书,请参阅第 53 页。
关于C# 依赖属性 - 是否检查 CLR Wrapper 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4548497/