【问题标题】:Howcome the get/set in dependency property doesn't do anything?为什么依赖属性中的 get/set 没有做任何事情?
【发布时间】:2012-08-10 17:21:39
【问题描述】:

我创建了一个这样的依赖属性:

public partial class MyControl: UserControl
{
   //...

   public static DependencyProperty XyzProperty = DependencyProperty.Register("Xyz",typeof (string),typeof (MyControl),new PropertyMetadata(default(string)));

   public string Xyz
   {
       get { return (string) GetValue(XyzProperty ); }
       set { SetValue(XyzProperty , value); }            
   }

   //...
}

然后将它绑定到我的 wpf 窗口,一切正常。

当我尝试向 setter 添加一些 logic 时,我注意到它没有被调用。我修改了get;设置到现在它们看起来像这样:

 get{return null;}
 set{}

它仍然有效!怎么会? GetValue/SetValue 调用有什么用?

【问题讨论】:

  • 另请参阅here,了解为什么不应该将任何其他逻辑放入属性包装器中。

标签: c# wpf dependency-properties


【解决方案1】:

WPF 数据绑定基础结构直接使用 DependencyProperty,Xyz 属性是程序员的便利接口。

查看 DependencyProperty.Register 调用中的 PropertyMetadata,您可以提供一个回调,该回调将在属性值更改时运行,您可以在此处应用您的业务逻辑。

【讨论】:

  • 我明白了。但我仍然需要它对吗?我试图从源代码中删除它,显然编译器抱怨
  • 只有在代码中引用该属性时才需要该属性。否则不需要它,如果您以声明方式绑定,您将使用名称“Xyz”但将解析为您的依赖属性而不需要成员属性。
【解决方案2】:

DependencyProperty 是 XyzProperty 的后备存储。如果通过 DependencyProperty 接口访问属性,则完全绕过属性的 Get/Set 访问器。

这样想:

private int _myValue = 0;

public int MyValue
{
    get { return _myValue; }
    set { _myValue = value; }
}

在这种情况下,如果我手动分配_myValue = 12,显然不会调用 MyValue 属性的“Set”访问器;我完全绕过它! DependencyProperties 也是如此。 WPF 的绑定系统直接使用 DependencyProperty 接口。

【讨论】:

  • 这就是为什么我必须调用 GetValue/SetValue 对吗?如果我直接调用this.Xyz="newValue";
  • 对。 Get/Set 属性包装器对您来说很方便,但最终与 WPF 的绑定系统无关。
猜你喜欢
  • 2021-08-11
  • 2021-12-20
  • 2011-07-25
  • 2015-06-30
  • 2023-04-06
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多