"前缀'x'未映射到命名空间"

Chr*_*ham 8 c# wpf xaml .net-4.0

我想在运行时使用加载DataTemplate XamlReader,但它抛出异常"前缀'x'不映射到命名空间."

这是我传递给的XML字符串XamlReader:

<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>
Run Code Online (Sandbox Code Playgroud)

这是读它的代码:

ResourceDictionary dictionary = XamlReader.Parse(myXamlString) as ResourceDictionary;
Run Code Online (Sandbox Code Playgroud)

这是有趣的部分,如果我添加x:Key="ValidationResponseTemplate"到DataTemplate它解析没有任何异常.但是,我无法保持这种方式,因为我无法通过程序自己的键来指定DataTemplate .xaml(在运行时获取模板之前它不会知道模板).

x命名空间中都属于程序自身的定义.xaml和XML的片段,我试图解析.

总体目标:能够提供新的DataTemplates,既可以在运行时更改显示的外观,也可以显示客户端在编译时不知道的XML数据.

Chr*_*ham 3

找到了解决方法:如果XamlReader我给它一个XmlReader. 其中定义的 XML 片段DataTemplate是一个更大的 XML 文档的一部分,该文档的所有命名空间都在其根中定义。这已经被读入一个XDocument,并且我从其中抓取了其中定义的XElementResourceDictionary新代码是 的一部分MainWindow.xaml.cs,如下所示:

ResourceDictionary dictionary = XamlReader.Load(myXElement.CreateReader()) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(dictionary);
Run Code Online (Sandbox Code Playgroud)

这引发了一个不同的异常,它无法解析(http://myschemas/MyProfile)Binding. 事实证明,您需要限定所有内容的名称空间,包括{Binding ...}引用。因此 XML 片段必须修改为:

<xm:TextBox Text="{xm:Binding Path=MessageID}"/>
Run Code Online (Sandbox Code Playgroud)

现在 XamlParser 知道这Binding是“http://schemas.microsoft.com...”命名空间中的类型。