c# - 访问 MarkupExtension.ProvideValue 中的构造函数参数

标签 c# wpf xaml .net-4.0

我有 MyListYExtension 没有默认构造函数的标记扩展。因此它只能用构造函数语法创建。 另一个 GetValueExtension 标记扩展试图确定所请求值的目标类型,以便它可以进行必要的转换。例如,如果您将第二个扩展的值分配给 Double 类型的属性,GetValueExtension 会理解它并返回 2.0 而不是“2”。虚拟示例:

{MyListX Capacity={GetValue ListCapacityParam}}    

如果我将 GetValueExtension 分配给属性,一切都会顺利进行。然后目标类型可以在 MarkupExtension.ProvideValue 中通过

访问
((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType

但是当我将 GetValueExtension 用作 MyListYExtension 的构造函数的参数时,TargetProperty 为空:

<!-- no default constructor in MyListY -->
<!-- the first parameter of MyListY is "int capacity" -->
{MyListY {GetValue ListCapacityParam}} 

当 XAML 解析器为属性赋值时,它会执行默认转换。 但是当它从标记扩展中获取值时它不会这样做。它会导致无法分配的异常,例如字符串值到 double 属性。 为避免这种情况,我尝试模拟默认转换,但为此需要知道目标类型。

我在 MarkupExtension.ProvideValue 调用中找不到任何解决方法来确定构造函数参数的实际类型

我可以修改 GetValueExtension 但不能修改 MyListYExtension

我该怎么做才能解决这个问题?

最佳答案

这看起来像是先有鸡还是先有蛋的问题。问题是构造函数可以重载,为了找到合适的构造函数,框架需要知道您试图传递给它的参数的类型。

换句话说,在调用 ProvideValue 时,不知道将使用什么构造函数,因此无法提供有关目标类型的信息。

关于c# - 访问 MarkupExtension.ProvideValue 中的构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314699/

相关文章:

c# - C# 中的 Image.FromStream()

c# - OxyPlot,不在 LineSeries 中的点

c# - 在 c# wpf 中将 WriteableBitmap 像素格式转换为 Bgra32

xaml - Xamarin 在图像上形成垂直居中的文本

c# - 在 Run 中指定相对 FontSize

c# - 通过 Exchange Web 服务访问投票按钮扩展属性

c# - NTextCat 是如何工作的

c# - 'run all tests' 发现但未运行 XUnit 测试

C# HAP如何获取重定向的url

.net - 在 Label 的内容中明确使用 TextBlock 会使 ContentPresenter 行为异常