首页 > 解决方案 > 如何确定标记扩展返回值的目标类型?

问题描述

我正在编写一个自定义标记扩展。在它的ProvideValue方法中,我想根据标记扩展用于为其提供值的属性的预期目标类型来修改/转换我的返回值。

(基本上,aTypeConverter知道其周围绑定的目标类型,并可以相应地调整其行为;我想在我的标记扩展中做同样的事情。)

现在,该ProvideValue方法只接收一个IServiceProvider作为参数。看来我应该能够使用它来获取一个对象,该对象为我提供所需的上下文信息,但到目前为止,我的尝试都没有完全令人满意:

标记扩展获取其目标类型的预期方式是什么?

标签: c#.netwpfxamlmarkup-extensions

解决方案


使用IServiceProvider让自己成为IProvideValueTarget,然后查看TargetProperty,应该(但不保证)是DependencyProperty

var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var propertyType = (provideValueTarget.TargetProperty as DependencyProperty)?.PropertyType;
// Test propertyType for null

EventInfo如果 MarkupExtension 与事件一起使用,目标属性也可能是一个,或者MethodInfo如果它与附加事件一起使用(或者,正如您在评论中指出的,PropertyInfo如果它与普通属性一起使用)。

不幸的是,我认为这是这样做的唯一方法。DynamicResourceExtension有类似的检查,请参见此处此处- 如果有更好的 API,我认为它会使用它。


推荐阅读