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