2011-04-12 15 views
8

XamlReader kullanarak bir DataTemplate yüklemek istiyorum, ancak istisna atıyor "Prefix 'x' bir ad alanına eşlenmiyor." Ben DataTemplate için x:Key="ValidationResponseTemplate" eklerseniz İşte"Önek 'x' bir ad ile eşleşmiyor"

ResourceDictionary dictionary = XamlReader.Parse(myXamlString) as ResourceDictionary; 

komik kısmı oluyor: Bu okuyor koddur

<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> 

:

Bu

ben XamlReader için geçiyorum XML dizesi herhangi bir istisna olmaksızın ayrıştırır. Ancak, bu şekilde devam edemem çünkü DataTemplate'i programın kendi .xaml anahtarıyla belirtemem (çalışma zamanında alınana kadar şablon hakkında bilgi sahibi olmaz).

x ad alanı, hem programın kendi .xaml hem de ayrıştırmaya çalışıyorum XML parçasında tanımlanmıştır.

Genel hedef: Hem çalışma zamanında görüntüsünün görünümünü değiştirmek hem de istemcinin derleme zamanında bilmediği XML verilerini görüntülemek için yeni DataTemplates sağlayabilecektir.

cevap

3

Etrafında bir yol bulundu: XamlReader bir dizeyi ayrıştırmak yerine, bir XmlReader verdiysem daha iyi çalıştı. İçinde tanımlanan DataTemplate ile XML'in parçası, tüm ad alanlarının kökünde tanımlanmış daha büyük bir XML belgesinin parçasıydı. Bu zaten bir XDocument'a okunmuştu ve bunun içinde XElement'u içinde tanımlı ResourceDictionary ile yakaladım. Yeni kod, MainWindow.xaml.cs parçası, aşağıdaki gibi görünür:

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

Bu (http://myschemas/MyProfile)Binding tipini çözemedi farklı bir istisna, attı. Bu, {Binding ...} referansları dahil olmak üzere, her şeyin ad alanlarını nitelendirmeniz gerektiğine karar verir. ": //schemas.microsoft.com ... http" ad

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

Şimdi XamlParser Binding bir tip olduğunu biliyorlardı: Yani XML parçası biçimde değiştirilmesi gerekiyordu.

İlgili konular