DataTemplate, созданный с использованием XamlReader, не может найти StaticResources - PullRequest
2 голосов
/ 24 августа 2011

Этот код не загружается должным образом, хотя объявление того же DataTemplate в XAML работает нормально.

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 ]

4 голосов
/ 24 августа 2011

Я думаю, что 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 голос
/ 24 августа 2011

Я решил проблему: вместо использования StaticResource я определил ресурс как свойство и с помощью RelativeSource.AncestorType нашел окно, а затем с помощью Path получил доступ к свойству.

...