【问题标题】:PropertyDescriptor and WPF Binding mechinsmPropertyDescriptor 和 WPF 绑定机制
【发布时间】:2013-11-16 00:49:11
【问题描述】:

背景

我正在调查一些代码,遇到了一个包含 DataGrid 和一些绑定列的 xaml:

Binding="{Binding calc_from}" ....

我到处搜索,但没有一个类包含名为calc_from 的属性。 然后我偶然发现了一些PropertyDescriptor 课程。我认为这就是他们使绑定工作的方式,但不完全理解如何。

问题

PropertyDescriptor 是什么?它有什么用? 我什么时候想实现自己的CustomTypeDescriptor? 又和WPF绑定机制有什么关系?

我在this 线程中遇到了一个示例,但如果有人能对此有所了解,我会很高兴

【问题讨论】:

  • 好问题,我自己也想知道。

标签: c# wpf xaml


【解决方案1】:

什么是 PropertyDescriptor,它有什么用处?

PropertyDescriptor 是一个抽象类,提供了一些方法和属性,这些方法和属性主要用于内部的 Binding 类。例如,WPF 具有那些“正常”属性和依赖属性,Binding 也使用 PropertyDescriptor 作为普通属性和一个 DependencyPropertyDescriptor,它继承自 PropertyDescriptor 并覆盖其抽象方法,例如 SetValue、GetValue、ResetValue..etc。此外,如果实际属性的所有者类实现了 INotifyPropertyChanged,那么这些 PropertyDescriptor 提供了一种机制来侦听 PropertyChanged 事件。总结一下,当我们谈论 WPF 中的绑定时,一方面是 PropertyDescriptor,另一方面是模型类提供所需的属性。

我什么时候想实现自己的描述符?

我现在能想到的唯一示例是,当您出于某种原因无法在实体类中实现 INotifyPropertyChanged 并且您必须进行某种轮询来询问或更改属性时,您将编写自己的 PropertyDescriptor 做某种每 1/100 秒对属性进行轮询,询问其值。如果您告诉 Binding 使用您的自定义 PropertyDescriptor,您最终将拥有一个“PollingBinding”类。

另一个例子是“DelayBinding”,有些人在互联网上写了一个自定义 PropertyDescriptor 与 Binding 相结合,它计算您希望在属性上设置值的频率以及您是否尝试在 1 中设置值 1000 次/100 秒,那么这件事将允许您每 10 次这样做一次,因此它会给您带来一点延迟。

您发布给我们的链接中的示例是另一个很好的示例。在那个问题中,这个家伙希望拥有自己的自定义类型描述符来管理自己的自定义更改通知。这就是 PropertyDescriptor 派上用场的地方。

PropertyDescriptor 通常与 Binding 一起使用。仅此一点就很垃圾。 :)

【讨论】:

  • 谢谢,这是一个很好的解释,尽管据此我不完全确定我理解这如何在我查看的代码中派上用场。似乎在该代码中,DataGrid 的 ItemsSourceDictionary<string, string>calc_from 是字典中的一个键,其中实际显示的是值。我仍然不明白PropertyDescriptor 是如何帮助你做到这一点的......
  • @Omribitan 我在您给我们的链接中没有看到任何 calc_from。 DataGrid 和 calc_from 是什么意思?
  • @devhedgehog 不在我发布的链接中,而是在我调查的代码中,看看问题的背景......
  • @Omribitan 很难说,因为我不知道你在调查什么代码。该代码中的 DataContext 是否设置为 PropertyDescriptor?你是什​​么意思“这就是他们使绑定工作的方式?当 PropertyDescriptor 设置为 DataContext 时,Binding Source 值将是该 PropertyDescriptor 的实例。绑定将请求 calc_from 的值,并且该自定义 PropertyDescriptor 将使用键从字典中返回值calc_from.
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多