【问题标题】:Custom binding class is not working correctly自定义绑定类无法正常工作
【发布时间】: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


【解决方案1】:

在使用标记扩展进行进一步测试后,这个问题一遍又一遍地解决了我的问题,在谷歌搜索之后,我想我已经找到了一个确认,这是 Visual Studio 设计器中的一个错误。大家有兴趣的可以看看

http://www.hardcodet.net/2008/04/nested-markup-extension-bug

最好的问候, 勒内

【讨论】:

    【解决方案2】:

    从 Binding 继承可能不是最好的解决方案。如果您只是想绕过将转换器声明为静态资源,请尝试创建转换器的单例,并像这样使用它:

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

    或者,您可以尝试使用here 所示的标记扩展。

    【讨论】:

      【解决方案3】:

      感谢您的回复!

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

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

      直到今天下午,我都非常确定问题出在电脑前。但是我已经在另外两个用户组中发布了这个问题(也在 WPF 论坛的 MSDN 上)。到现在为止,你是唯一回应的人。所以我想到了,这也可能是视觉工作室的问题......我不知道。

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

      周末愉快!

      最好的问候, 勒内

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,不知道为什么,但是我将自定义绑定放在另一个 dll 上并且它起作用了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-18
          • 2016-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多