使用XamlReader创建的DataTemplate无法找到StaticResources

时间:2011-08-24 09:38:37

标签: c# wpf xaml datatemplate

此代码无法正确加载,而在XAML中声明相同的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);
}

我需要在代码中执行此操作。怎么样?

2 个答案:

答案 0 :(得分:4)

我认为StaticResource需要在加载时解决,因为它不在上下文中,所以它会失败。 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 :(得分:1)

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