我想在运行时使用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数据。
答案 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 ...”命名空间中的一种类型。