从不同程序集引用转换器时出现XamlParseException

时间:2012-04-13 14:02:44

标签: c# wpf converter

我有一个XAML UserControl,它使用同一项目中包含的转换器。

xmlns:filter="clr-namespace:SampleModuleFilter" - namespace definition

到目前为止一切顺利。但是,当我将转换器移动到另一个程序集并相应地调整名称空间和引用时,我得到以下异常: XamlParseException - “在'System.Windows.Markup.StaticResourceHolder'上提供值引发异常。内部异常声明”方法或操作未实现。“这很奇怪。 移动到另一个库后的命名空间如下所示:

xmlns:filter="clr-namespace:SampleLibrary.Converters;assembly=SampleLibrary"

转换器资源定义是:

<filter:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" />

我这样使用它:

Visibility="{Binding DisplayLabel, Converter={StaticResource ResourceKey=boolToVisibilityConverter}}"

IntelliSense显然可以看到库,因为它工作正常(在我写入命名空间前缀后提供转换器类)。

任何想法可能是什么问题?

4 个答案:

答案 0 :(得分:1)

您还必须在代码隐藏文件中引用程序集。

如果仅在XAML部分引用程序集,编译器将返回“无法加载xxx.dll”异常。

您还必须直接调用连接的程序集,如下所示:

var dummy = new MyExternalAssemby.MyType();

或仅在新的代码行中

new MyExternalAssemby.MyType();

不将结果放在虚拟变量中。

通常我在静态构造函数中这样做。 我认为这是XAML解释器中的一个错误,因为XAML没有编译,只是在BAML(二进制XAML)中“翻译”。因此,如果您在XAML中引用某个类型而不在.NET链接器后面的代码中创建“硬”引用,则忽略它。

HTH 洛伦佐

答案 1 :(得分:1)

而不仅仅是:

 xmlns:filter="clr-namespace:SampleModuleFilter"

也参考组件

 xmlns:filter="clr-namespace:SampleModuleFilter;assembly=SampleModuleFilterAssemblyName"

这应该可以解决问题。

答案 2 :(得分:0)

这很奇怪;我们的转换器都位于中央库中,并且工作正常。假设引用和命名空间是正确的,我唯一可以建议的是清理和重建有问题的两个项目。

答案 3 :(得分:0)

您的代码中某处使用了“SampleLibrary.dll”吗?

我遇到一个奇怪的错误,在编译时会跳过仅在xaml文件中使用的引用程序集,并且不会出现在dll依赖项中。