2011-04-12 70 views
8

我想在運行時使用XamlReader加載DataTemplate,但它引發異常「前綴'x'不映射到名稱空間」。「前綴'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數據。

回答

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 ......」的命名空間。