目前我正在研究 WPF 数据绑定,但遇到了一个我不明白的问题。所以我把问题发布在这里,也许你已经知道地理出了什么问题。
首先:我在Windows Vista 32位下使用Visual Studio 2008,问题也存在于Windows 7 RC1 64位中,安装了除Vista之外的最新更新/服务包,它仍然运行SP1。
问题是这样的:
我无法在继承的 Binding 类中设置 ValueConverter。
这是我的自定义绑定类:
public class MyBinding : Binding
{
public MyBinding() : base() { }
public MyBinding(string path) : base(path) { }
}
该类应该与原始 Binding 类完全相同,因为目前它没有实现任何自己的逻辑。我可以在 XAML 中使用此类,如下所示:
<TextBlock Text="{local:MyBinding SomeProperty}" />
local 是实现 MyBinding 类的命名空间。
现在我不明白的第一件事来了。 VS2008在其错误窗口中显示以下错误消息(原始消息是德语,因为我运行的是德语系统 - 我没有英语错误消息,所以我会尝试翻译)
MyBinding-Typs 的基本结构是 1 参数 auf。
(MyBinding 类型的构造函数不接受 1 个参数)
尽管显示此错误,但项目编译得很好,并且 MyBinding 类按预期工作。为什么 Visual Studio 找不到相应的构造函数(我想说,它已正确实现)?
如果我将 XAML 代码更改为以下内容,我可以阻止这些消息:
<TextBlock Text="{local:MyBinding Path=SomeProperty}" />
错误消息消失了,因为调用了 MyBinding 的默认构造函数,一切正常,好吧...
现在我想为我的属性绑定设置一个 ValueConverter,XAML 如下所示:
<Window.Resources>
<local:MyValueConverter x:Key="converter" />
</Window.Resources>
[...]
<TextBlock Text="{local:MyBinding Path=SomeProperty, Converter={StaticResource converter}}" />
[...]
...,在这里我在编译时收到以下错误(德语原文,我认为,我还找到了英文原文):
Beim Analysieren 的标记扩展是典型的“MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension”,而不是 Eigenschaft“Converter”gefunden。 Zeile X 位置 Y。
(解析标记扩展时遇到类型“MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension”的未知属性“Converter”。行 x 位置 Y)
现在我无法再编译,因为 VS 找不到转换器属性(这是原始 Binding 类的公共属性)。
我已经设法让 MyBinding 类与我指定的转换器一起运行,但只需要一点技巧:
我已将以下属性添加到 MyBinding 类:
public Type ConverterType
{
get { return Converter == null ? null : Converter.GetType(); }
set { Converter = value == null ? null : (IValueConverter)Activator.CreateInstance(value); }
}
...XAML 对此进行了更改:
<TextBlock Text="{local:MyBinding Path=SomeString, ConverterType=local:MyValueConverter}" />
现在我的项目编译并运行良好。实际上我认为,这是一个很好的解决方案,因为您不必将转换器指定为静态资源,并且绑定表达式对我来说看起来更清晰一些。但归根结底,这并不是解决问题的办法。
那么谁能告诉我我做错了什么?为什么我无法在自定义 Binding 类中设置 Converter 属性?
谢谢你!
此致,
勒内