7 .net c# data-binding wpf visual-studio
目前我正在玩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) { }
}
Run Code Online (Sandbox Code Playgroud)
这个类应该与原始的Binding类完全相同,因为它目前没有实现任何自己的逻辑.我可以在XAML中使用这个类,如下所示:
<TextBlock Text="{local:MyBinding SomeProperty}" />
Run Code Online (Sandbox Code Playgroud)
local是实现MyBinding类的命名空间.
现在这里是我不了解的第一件事.VS2008在其错误窗口中显示以下错误消息(原始消息是德语,因为我正在运行德语系统 - 我没有英语错误消息,所以我将尝试翻译)
Kein Konstruktor des MyBinding-Typs weist 1-parameter auf.
(没有MyBinding类型的构造函数需要1个参数)
虽然这个错误显示项目编译得很好,MyBinding类正在按预期工作.为什么Visual Studio找不到相应的构造函数(我会说,这是正确实现的)?
如果我将XAML代码更改为此,我可以阻止这些消息:
<TextBlock Text="{local:MyBinding Path=SomeProperty}" />
Run Code Online (Sandbox Code Playgroud)
错误信息消失了,因为调用了MyBinding的默认构造函数,一切正常,好吧......
现在我想将ValueConverter设置为我的属性绑定,XAML看起来像这样:
<Window.Resources>
<local:MyValueConverter x:Key="converter" />
</Window.Resources>
[...]
<TextBlock Text="{local:MyBinding Path=SomeProperty, Converter={StaticResource converter}}" />
[...]
Run Code Online (Sandbox Code Playgroud)
...,这里我在编译时遇到以下错误(德语原文,我想,我也用英文发现了原始信息):
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); }
}
Run Code Online (Sandbox Code Playgroud)
...和XAML更改为:
<TextBlock Text="{local:MyBinding Path=SomeString, ConverterType=local:MyValueConverter}" />
Run Code Online (Sandbox Code Playgroud)
现在我的项目编译并运行正常.实际上我认为,这是一个很好的解决方案,因为您不必将转换器指定为静态资源,并且绑定表达式对我来说更清晰一些.但最后,这不是解决方案.
那么有谁能告诉我我做错了什么?为什么我无法在自定义Binding类中设置Converter属性?
谢谢!最好的问候,René
小智 6
经过一些标记扩展的进一步测试后,这个问题一遍又一遍地传递给我,经过一些谷歌搜索,我想我已经找到了一个确认,这是Visual Studio设计器中的一个错误.每个对此感兴趣的人都应该看看
http://www.hardcodet.net/2008/04/nested-markup-extension-bug
最好的问候,René
从 Binding 继承可能不是最好的解决方案。如果您只是想绕过将转换器声明为静态资源,请尝试创建转换器的单例,并像这样使用它:
Text="{Binding Path=Foo, Converter={x:Static local:MyConverter.Converter}}"
Run Code Online (Sandbox Code Playgroud)
或者,您可以尝试标记扩展,如下所示。
| 归档时间: |
|
| 查看次数: |
4160 次 |
| 最近记录: |