2011-04-12 11 views
8

मैं XamlReader का उपयोग कर रनटाइम पर डेटा टेम्पलेट लोड करना चाहता हूं, लेकिन यह अपवाद फेंक रहा है "उपसर्ग 'x नामस्थान पर मैप नहीं करता है।""उपसर्ग 'x' नामस्थान पर मैप नहीं करता है"

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

यहाँ है अजीब हिस्सा है, अगर मैं DataTemplate को x:Key="ValidationResponseTemplate" जोड़ें:

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

इस कोड है कि इसे पढ़ने के है:

यह XML स्ट्रिंग मैं XamlReader को गुजर रहा हूँ है यह बिना किसी अपवाद के पार्स करता है। मैं इसे इस तरह से नहीं रख सकता, हालांकि, क्योंकि मैं प्रोग्राम के अपने .xaml में कुंजी द्वारा डेटा टेम्पलेट निर्दिष्ट नहीं कर सकता (यह टेम्पलेट के बारे में तब तक नहीं जानता जब तक कि इसे रनटाइम पर नहीं लाया जाता)।

x नामस्थान को प्रोग्राम के अपने .xaml दोनों में परिभाषित किया गया है और एक्सएमएल के टुकड़े में मैं पार्स करने की कोशिश कर रहा हूं।

कुल मिलाकर उद्देश्य: रनटाइम पर प्रदर्शन की उपस्थिति को बदलने और एक्सएमएल डेटा प्रदर्शित करने के लिए नए डेटा टेम्पलेट्स प्रदान करने में सक्षम होने के लिए क्लाइंट को संकलन समय पर नहीं पता था।

उत्तर

3

इसके चारों ओर एक रास्ता मिला: XamlReader एक स्ट्रिंग पार्स करने के बजाय, यह बेहतर काम करता है अगर मैंने इसे XmlReader दिया। DataTemplate के साथ एक्सएमएल का टुकड़ा उसमें परिभाषित एक बड़े एक्सएमएल दस्तावेज़ का हिस्सा था जिसमें इसकी सभी नामस्थानों को इसकी जड़ में परिभाषित किया गया था। इसे पहले से ही XDocument में पढ़ा गया था, और जिसमें से मैंने XElement को ResourceDictionary में परिभाषित किया था। नए कोड, MainWindow.xaml.cs का हिस्सा है, इस तरह दिखता है:

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

यह एक अलग अपवाद है, जहां यह (http://myschemas/MyProfile)Binding के प्रकार हल नहीं कर सका फेंक दिया। यह पता चला है कि {Binding ...} संदर्भों सहित सब कुछ के नामस्थानों को अर्हता प्राप्त करने की आवश्यकता है।

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

अब XamlParser जानता था कि Binding में एक प्रकार था, "http: //schemas.microsoft.com ..." नाम स्थान तो एक्सएमएल टुकड़ा पर संशोधन किया जाना था।

संबंधित मुद्दे