C# 依赖属性 - 是否检查 CLR Wrapper 中的值

标签 c# optimization binding dependency-properties

在用 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/

相关文章:

带有用户控件的 WPF 列表框作为 ItemTemplate DataTemplate 绑定(bind)问题

c# - 在具有分层数据模板的 TreeView 中绑定(bind)上下文菜单命令

c# - 如何使用 Exchange Web 服务在 C# 中更改电子邮件主题

c# - 对 Enumerable 调用 .ToArray 会破坏 Enumerable

c# - 我需要重复的测试方法吗? 1 个用于单元测试,1 个用于集成测试?

c++ - 极快is_iequal? (不区分大小写的相等比较)

c# - ActiveX 适用于本地主机,不适用于外部服务器

c++ - 为什么内联被认为比函数调用更快?

c - 如何优化图像像素化程序

c# - 是否可以将数据绑定(bind)到内存中的对象并允许数据绑定(bind)到 XML