自定义绑定类无法正常工作

时间:2009-06-19 13:44:40

标签: c# .net wpf visual-studio data-binding

目前我正在玩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属性?

谢谢! 最好的祝福, 勒

4 个答案:

答案 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上并且它有效。