【问题标题】:C# Dependency Properties - Whether to Check Value in CLR WrapperC# 依赖属性 - 是否检查 CLR Wrapper 中的值
【发布时间】:2011-05-31 17:09:03
【问题描述】:

在 C# 中编写自定义依赖属性时,一个相当常见的包装器类似于:

    public string Surname
    {
        get
        {
            return this.GetValue(SurnameProperty) as string;
        }

        set
        {
            this.SetValue(SurnameProperty, value);
        }
    }

现在,当使用 NotifyPropertyChanged 系统时,我通常会在实际提交值并调用 OnPropertyChanged 之前检查“set”块中的值是否已更改。我应该对依赖属性做同样的事情吗?即:

        set
        {
            if(this.GetValue(SurnameProperty) != value)
               this.SetValue(SurnameProperty, value);
        }

...或者这是完全没有必要并且已经由 CLR 处理的事情?在调用 SetValue 之前,我已经看到 MSDN 上的所有示例都无需进行任何检查。非常感谢。

【问题讨论】:

  • 您的 getter/setter 可能并不总是被调用。 WPF 将直接尝试设置值。
  • 感谢提醒!就我而言,有时我还通过 CLR 包装器而不是通过绑定来设置值,所以问题确实与这种情况有关。尽管如此,考虑依赖属性如何真正起作用并没有任何害处。干杯。

标签: c# optimization binding dependency-properties


【解决方案1】:

不,它由依赖属性系统处理。

【讨论】:

    【解决方案2】:

    简短的回答是,不,它已经被框架处理了。

    实际上,根据 Adam Nathan 的“Windows Presentation Foundation”,XAML 编译器在编译时依赖于属性变形器。但是,.NET 属性包装器实际上在运行时在 XAML 中被绕过。因此,您实际上应该避免在 GetValue/SetValue 之外添加任何类型的逻辑。无论您在 setter 中添加什么逻辑,只有在显式调用该属性时才会执行。但是,如果在 XAML 中绑定该属性,运行时将跳过它。如果您的设置器中有错误,这可能需要您一些时间才能弄清楚。如果您手里拿着那本书,请参阅第 53 页。

    【讨论】:

    • 谢谢 - 听起来像是我需要看的一本书!
    【解决方案3】:

    由属性更改回调处理。 PropertyChangedCallback 仅在属性值发生变化时调用。

    public static readonly DependencyProperty MyDependencyProperty =
                       DependencyProperty.Register(
                             "Dependency",
                              typeof(string),
                              typeof(MyUserControl),
                              new FrameworkPropertyMetadata("Initializing...", new PropertyChangedCallback(OnMyDependencyChangedCallBack)));
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      相关资源
      最近更新 更多