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

C# 自定义绑定类无法正常工作,c#,.net,wpf,visual-studio,data-binding,C#,.net,Wpf,Visual Studio,Data Binding,目前我正在玩弄WPF数据绑定,遇到了一个我不理解的问题。所以我把问题贴在这里,也许你知道哪里出了问题 首先:我在Windows Vista 32位下使用Visual Studio 2008,问题也存在于Windows 7 RC1 64位中,安装了除Vista之外的最新更新/service Pack,Vista仍在使用SP1运行 问题是: 我无法在继承的绑定类中设置ValueConverter 以下是我的自定义绑定类: public class MyBinding : Binding {

目前我正在玩弄WPF数据绑定,遇到了一个我不理解的问题。所以我把问题贴在这里,也许你知道哪里出了问题

首先:我在Windows Vista 32位下使用Visual Studio 2008,问题也存在于Windows 7 RC1 64位中,安装了除Vista之外的最新更新/service Pack,Vista仍在使用SP1运行

问题是: 我无法在继承的绑定类中设置ValueConverter

以下是我的自定义绑定类:

public class MyBinding : Binding
{
    public MyBinding() : base() { }
    public MyBinding(string path) : base(path) { }
}
    public Type ConverterType
    {
        get { return Converter == null ? null : Converter.GetType(); }
        set { Converter = value == null ? null : (IValueConverter)Activator.CreateInstance(value); }
    }
这个类应该与原始绑定类完全相同,因为它目前没有实现任何自己的逻辑。我可以在XAML中使用该类,如下所示:

<TextBlock Text="{local:MyBinding SomeProperty}" />
。。。XAML对此进行了更改:

<TextBlock Text="{local:MyBinding Path=SomeString, ConverterType=local:MyValueConverter}" />

现在我的项目编译并运行良好。实际上,我认为这是一个很好的解决方案,因为您不必将转换器指定为静态资源,而且绑定表达式在我看来更清晰一些。但最终,这不是解决办法

有人能告诉我我做错了什么吗?为什么我不能在自定义绑定类中设置转换器属性

谢谢大家!! 顺致敬意,
Rene

从绑定继承可能不是最好的解决方案。如果您只是想将转换器声明为静态资源,请尝试创建转换器的单例,并按如下方式使用:

Text="{Binding Path=Foo, Converter={x:Static local:MyConverter.Converter}}"

或者,您可以尝试如图所示的标记扩展。

谢谢您的回复

一般来说,我对绑定表达式语法和在使用转换器之前声明转换器没有问题。我上面写的只是解决我主要问题的一个很好的结果。我想创建我自己的绑定类,并将我自己的转换器传递给它,就像我对原始绑定类所做的那样

我只是想理解错误消息,它是由VS提供给我的。我认为它一定有原因,要么是我做错了什么,要么是Visual Studio/WPF中存在错误

直到今天下午,我还很确定问题出在电脑前。但我已经在另外两个用户组中发布了这个问题(也在WPF论坛的MSDN上)。到目前为止,你是唯一做出回应的人。所以我有了一个想法,那就是这可能也是visual studio的一个问题。。。我不知道

再次感谢你,我会仔细看看你发布的页面(目前只是一个简短的页面)

祝你周末愉快

致以最良好的祝愿,
René

在对标记扩展进行了一些进一步的测试之后,这个问题一次又一次地通过了我的途径,在进行了一些谷歌搜索之后,我想我已经找到了一个确认,这是Visual Studio designer中的一个bug。所有对此感兴趣的人都应该看看

致以最良好的祝愿,
René

我也遇到了同样的问题,不知道为什么,但我将自定义绑定放在了另一个dll上,它成功了。

您可以使用ConstructorArgumentAttribute,而不必显式地声明
路径=…
<TextBlock Text="{local:MyBinding Path=SomeString, ConverterType=local:MyValueConverter}" />
Text="{Binding Path=Foo, Converter={x:Static local:MyConverter.Converter}}"