2011-04-12 4 views
8

XamlReader을 사용하여 런타임에 DataTemplate을로드하려고하지만 "접두사 'x'가 네임 스페이스에 매핑되지 않습니다."라는 예외가 발생합니다. 내가 DataTemplate을에 x:Key="ValidationResponseTemplate"를 추가하는 경우 여기"접두사 'x'는 네임 스페이스에 매핑되지 않습니다."

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

재미있는 부분이있어이 그것을 읽는 것 코드가

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

:

내가 XamlReader에 전달있어 XML 문자열입니다 그것은 예외없이 구문 분석합니다. 그러나, 그 자체로 .xaml 키의 DataTemplate을 지정할 수 없기 때문에 (런타임에 가져올 때까지 템플릿에 대해 알지 못하기 때문에) 나는 그렇게 할 수 없습니다.

x 네임 스페이스는 프로그램 자체의 .xaml과 구문 분석하려는 XML 조각 모두에 정의됩니다.

전체적인 목표 : 런타임시 디스플레이 모양을 변경하고 클라이언트가 컴파일시에 알지 못했던 XML 데이터를 표시하는 데 새로운 DataTemplates를 제공 할 수 있어야합니다.

답변

3

주위를 둘러 보니 XamlReader 문자열을 구문 분석하는 대신 XmlReader을 입력하면 더 잘 작동합니다. DataTemplate이 정의 된 XML 단편은 루트에 모든 네임 스페이스가 정의 된 더 큰 XML 문서의 일부였습니다. 이것은 이미 XDocument으로 읽었으며 그 중 XElementResourceDictionary으로 정의했습니다. 새로운 코드는 MainWindow.xaml.cs의 일부는 다음과 같습니다

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

이 그것을 (http://myschemas/MyProfile)Binding의 유형을 확인할 수 없습니다 다른 예외를 던졌다. 네임 스페이스를 모두 ({Binding ...} 참조)을 포함하여 한정해야합니다. "//schemas.microsoft.com ... HTTP"네임 스페이스

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

지금 XamlParser는 Binding이의 유형 것을 알고 : 그래서 XML 조각을 개정했다.

관련 문제