属性描述符和WPF绑定机制

9

背景

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

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

我到处搜索,但没有包含名为calc_from的属性的类。然后我偶然发现了一些PropertyDescriptor类。我想这就是它们如何使绑定工作的方式,但我并没有完全理解它的原理。
问题: PropertyDescriptor是什么?它有什么好处? 何时需要实现自己的CustomTypeDescriptor? 它与WPF绑定机制有什么关系?
我在这个线程中找到了一个示例,但如果有人能给我更多的解释,我会很高兴。

1
好问题,我自己也在想。 - eran otzap
1个回答

6

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

PropertyDescriptor是一个抽象类,提供了一些方法和属性,主要在Binding类内部使用。例如WPF有“普通”属性和依赖属性,Binding使用PropertyDescriptor处理普通属性,而DependencyPropertyDescriptor则继承自PropertyDescriptor并覆盖其抽象方法,如SetValue、GetValue、ResetValue等。此外,这些PropertyDescriptor还提供了一种机制来监听PropertyChanged事件,如果实际属性的所有者类实现了INotifyPropertyChanged接口,则可以使用该机制。总之,在谈论WPF中的绑定时,PropertyDescriptor在一侧,模型类在另一侧提供所需的属性。

什么情况下我会想要实现自己的描述符?

我现在能想到的唯一例子是,当你无法出于任何原因在实体类中实现INotifyPropertyChanged时,你必须进行某种轮询以询问或更改属性,然后你将编写自己的PropertyDescriptor,在属性上进行轮询,每1/100秒询问其值。如果告诉绑定使用您的自定义PropertyDescriptor,则最终将拥有“PollingBinding”类。

另一个例子是“DelayBinding”,一些人在互联网上编写了一个自定义PropertyDescriptor与Binding结合使用,计算您希望在属性上设置值的次数,如果您试图在1/100秒内设置值1000次,则该工具将允许您这样做,但每10次就会提供一小段延迟。

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

PropertyDescriptor通常与Binding一起使用。这件事本身相当愚蠢。 :)


谢谢,这是一个很好的解释,尽管根据这个解释,我不完全确定我理解了它在我查看的代码中如何有用。似乎在那段代码中,DataGrid的“ItemsSource”是一个“Dictionary<string, string>”,而“calc_from”是字典中的一个键,实际显示的是值。我仍然不明白PropertyDescriptor如何帮助你做到这一点... - Omri Btian
@Omribitan,我在你给我们的链接中没有看到任何calc_from。你所说的DataGrid和calc_from是什么意思? - dev hedgehog
@devhedgehog 不在我发布的链接中,而是在我调查的代码中,请看问题的背景... - Omri Btian
1
@Omribitan 很难说,因为我不知道你正在调查的代码是什么。DataContext在那段代码中是否设置为PropertyDescriptor?你所说的“这就是他们让绑定工作的方式”是什么意思?当PropertyDescriptor被设置为DataContext时,Binding Source值将是该PropertyDescriptor的实例。Binding将请求calc_from的值,而自定义PropertyDescriptor将从具有calc_from键的字典中返回值。 - dev hedgehog
@OmriBtian -- 一个晚期的例子。你有一个对象,一个订单。它应该显示一个网格,每一列都是一个产品,单元格显示该产品的购买数量。问题是:在运行时你不知道产品列表,所以你不能直接在你的数据类中拥有像QtyProduct1QtyProduct2等字段。但是一个自定义的类型描述符,当在运行时提供了一个实际产品列表时,使用一个PropertyDescriptor为每个产品生成这样的字段,网格将会显示相同的内容。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接