【发布时间】:2010-11-04 07:40:07
【问题描述】:
目前我正在使用 WPF 数据绑定,但遇到了一个我不明白的问题。所以我把问题贴在这里,也许你知道什么地方出了问题。
起初:我在 Windows Vista 32bit 下使用 Visual Studio 2008,在 Windows 7 RC1 64bit 中也存在此问题,安装了除 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在其错误窗口中显示以下错误消息(原始消息是德语,因为我正在运行德语系统 - 我没有英文错误消息,所以我会尝试翻译)
Kein Konstruktor des MyBinding-Typs weist 1-Parameter auf.
(MyBinding 类型的构造函数没有一个参数)
尽管这个错误显示项目编译得很好并且 MyBinding 类按预期工作。为什么 Visual Studio 没有找到相应的构造函数(我想说,它是正确实现的)?
如果我将 XAML 代码更改为此,我可以阻止这些消息:
<TextBlock Text="{local:MyBinding Path=SomeProperty}" />
错误信息消失是因为调用了MyBinding的默认构造函数,一切正常,ok...
现在我想为我的属性绑定设置一个 ValueConverter,XAML 如下所示:
<Window.Resources>
<local:MyValueConverter x:Key="converter" />
</Window.Resources>
[...]
<TextBlock Text="{local:MyBinding Path=SomeProperty, Converter={StaticResource converter}}" />
[...]
...,在这里我在编译时收到以下错误(德语原文,我想,我也找到了英文原文):
Beim Analysieren einer Markup Extension wurde für den Typ "MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension" die unbekannte Eigenschaft "Converter" gefunden。 Zeile X 位置 Y。
(在解析标记扩展时遇到类型“MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension”的未知属性“转换器”。行 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 属性?
谢谢! 最好的祝福, 勒内
【问题讨论】:
-
您可以使用 ConstructorArgumentAttribute 不必显式声明
Path=...。
标签: c# .net wpf visual-studio data-binding