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

时间:2011-04-12 20:56:28

标签: c# wpf xaml .net-4.0

我想在运行时使用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;

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

x命名空间在程序自己的.xaml和我试图解析的XML片段中定义。

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

1 个答案:

答案 0 :(得分:3)

找到解决方法:不是让XamlReader解析字符串,如果我给它XmlReader,它会更好用。其中定义了DataTemplate的XML片段是更大的XML文档的一部分,该文档的根目录中定义了所有名称空间。这已被读入XDocument,其中我抓住XElement并定义了ResourceDictionary。新代码是MainWindow.xaml.cs的一部分,如下所示:

ResourceDictionary dictionary = XamlReader.Load(myXElement.CreateReader()) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(dictionary);

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

<xm:TextBox Text="{xm:Binding Path=MessageID}"/>

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