Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;前缀';x';不映射到命名空间";_C#_Wpf_Xaml_.net 4.0 - Fatal编程技术网

C# &引用;前缀';x';不映射到命名空间";

C# &引用;前缀';x';不映射到命名空间";,c#,wpf,xaml,.net-4.0,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

我想在运行时使用
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>
有趣的是,如果我将
x:Key=“ValidationResponseTemplate”
添加到它解析的数据模板中,没有任何异常。但是,我不能保持这种方式,因为我不能通过在程序自己的
.xaml
中的键指定DataTemplate(在运行时获取模板之前,它不会知道该模板)

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


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

找到了解决方法:与其让
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…}
引用。因此,XML片段必须修改为:

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

现在XamlParser知道,
Binding
是http://schemas.microsoft.com...“名称空间

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