目前我正在玩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类型的构造函数不带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 einer Markup ExtensionwurdefürdenTyp“MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension”die unbekannte 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属性?
谢谢! 最好的祝福, 勒
答案 0 :(得分:6)
经过一些标记扩展的进一步测试后,这个问题一遍又一遍地通过我的方式,经过一些谷歌搜索后,我想我已经找到了一个确认,这是Visual Studio设计器中的一个错误。每个对此感兴趣的人都应该看看
http://www.hardcodet.net/2008/04/nested-markup-extension-bug
祝你好运, 勒
答案 1 :(得分:2)
继承Binding可能不是最佳解决方案。如果您只想绕过将转换器声明为静态资源,请尝试创建转换器的Singleton,并像这样使用它:
Text="{Binding Path=Foo, Converter={x:Static local:MyConverter.Converter}}"
或者,您可以尝试使用here所示的标记扩展程序。
答案 2 :(得分:0)
感谢您的回复!
一般来说,我对绑定表达式语法没有问题,并在使用之前声明转换器。我上面写的只是我的主要问题的解决方法的一个很好的结果。我想创建自己的Binding类并将我自己的转换器传递给它,就像我使用原始Binding类一样。
我只是想了解错误信息,由VS呈现给我。我认为它必须有一个原因,要么我做错了,要么Visual Studio / WPF中存在错误。
直到今天下午,我才非常确定问题出在电脑前。但是我已经在另外两个用户组中发布了这个问题(也是在WPF论坛的MSDN上)。直到现在你才是唯一回应的人。所以我想到了这个想法,它也可能是视觉工作室的问题......我不知道。
再次,非常感谢,我将仔细查看您发布的页面(目前只是一个简短的页面)。
周末愉快!
祝你好运, 勒
答案 3 :(得分:0)
我有同样的问题,不知道为什么,但是我把自定义绑定放在另一个dll上并且它有效。