“前缀\'x\'不会映射到名称空间”

问题描述

| 我想在运行时使用
XamlReader
加载DataTemplate,但是它抛出异常\“前缀\'x \'不会映射到名称空间。\” 这是我要传递给
XamlReader
的XML字符串:
<xm:ResourceDictionary 
    xmlns:xm=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
    xmlns:do=\"clr-namespace:MyLibrary.DataObjects;assembly=MyLibrary.DataObjects\"
    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">
      <xm:DataTemplate DataType=\"{x:Type do:ValidationResponse}\">
        <xm:StackPanel Orientation=\"Horizontal\">
          <xm:Label>MessageID</xm:Label>
          <xm:TextBox Text=\"{Binding Path=MessageID}\"/>
        </xm:StackPanel>
      </xm:DataTemplate>
</xm:ResourceDictionary>
这是正在读取的代码
ResourceDictionary dictionary = XamlReader.Parse(myXamlString) as ResourceDictionary;
这是有趣的部分,如果我在解析的DataTemplate中添加“ 4”,则没有任何异常。但是,我不能保持这种方式,因为我无法通过程序自己的
.xaml
(通过在运行时获取模板之前不了解模板)来指定DataTemplate。 程序本身的
.xaml
和我要解析的XML片段中都定义了
x
名称空间。 总体目标:能够提供新的DataTemplates来在运行时更改显示的外观,并显示客户端在编译时不知道的XML数据。     

解决方法

找到了解决方法:与其让
XamlReader
解析一个字符串,不如给它一个
XmlReader
更好地工作。在其中定义了“ 10”的XML片段是一个更大的XML文档的一部分,该文档的所有名称空间均在其根目录中定义。这已经被读成
XDocument
,然后我抓起其中定义了
ResourceDictionary
XElement
。新代码是
MainWindow.xaml.cs
的一部分,如下所示:
ResourceDictionary dictionary = XamlReader.Load(myXElement.CreateReader()) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(dictionary);
这引发了一个不同的异常,即无法解析
(http://myschemas/MyProfile)Binding
的类型。事实证明,您需要限定所有内容的名称空间,包括“ 17”引用。因此,必须将XML片段修改为:
<xm:TextBox Text=\"{xm:Binding Path=MessageID}\"/>
现在XamlParser知道
Binding
是\“ http://schemas.microsoft.com ... \”命名空间中的类型。