使用XamlReader创建的DataTemplate无法找到静态资源

问题描述:

此代码无法正确加载,而在XAML中声明相同的DataTemplate可以正常工作。使用XamlReader创建的DataTemplate无法找到静态资源

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.Resources.Add("a", "Hello"); 
    DataTemplate t = GetObject("<DataTemplate><Label Content=\"{Binding Source={StaticResource a}}\"/></DataTemplate>") as DataTemplate; 
    list.ItemTemplate = t; 
    list.Items.Add(77); 
} 

public static Object GetObject(string xaml) 
{ 
    MemoryStream sr = null; 
    ParserContext pc = new ParserContext(); 
    sr = new MemoryStream(Encoding.ASCII.GetBytes(xaml)); 
    pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); 
    pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml"); 
    return XamlReader.Load(sr, pc); 
} 

我需要在代码中这样做。怎么样?

我解决了这个问题:不是使用StaticResource时,我将资源定义为属性,并使用RelativeSource.AncestorType找到窗口,然后使用Path访问属性。

我认为StaticResource需要加载时解决,因为它不在上下文中,它会失败。 A DynamicResource本可以工作,因为它可以等待直到查询提供值,但DynamicResource不能用作Binding的源。

如果情况允许的话,可以将资源添加到DataTemplate,而不是像这样

DataTemplate t = GetObject(@" 
    <DataTemplate> 
     <DataTemplate.Resources> 
      <sys:String x:Key=""a"">Hello</sys:String> 
     </DataTemplate.Resources> 
     <Label Content=""{Binding Source={StaticResource a}}""/> 
    </DataTemplate>") as DataTemplate; 
list.ItemTemplate = t; 

您还需要添加的xmlns字典

pc.XmlnsDictionary.Add("sys", "clr-namespace:System;assembly=mscorlib"); 
+0

非常感谢,对于建议+1,但在我的情况下这是不可能的。资源是一个列表,并在许多数据模板之间共享(对于运行时生成的许多不同列) – Alireza