XAMLParser创建的DataTemplate:引用StaticResource

时间:2017-06-26 23:39:37

标签: c# wpf xaml datatemplate xamlparseexception

我正在使用XamlReader在代码中创建DataTemplate:

public DataTemplate CreateDataTemplate()
{
    string template = @"<DataTemplate >
                            <StackPanel>        
                                <ComboBox ItemsSource=""{Binding Source={StaticResource collectibleTypeFromEnum}}"" />              
                            </StackPanel>
                        </DataTemplate>";

    ParserContext context = new ParserContext();
    context.XamlTypeMapper = new XamlTypeMapper(new string[0]);
    context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
    context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");

    // This is meant to provide reference to where collectibleTypeFromEnum lives
    context.XamlTypeMapper.AddMappingProcessingInstruction("myview", "MyProgram.View", "MyProgram, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
    context.XmlnsDictionary.Add("myview", "myview");

    return XamlReader.Parse(template, context) as DataTemplate;
}

XAMLParser成功解析字符串并返回一个DataTemplate,但它在运行时崩溃(&#39; System.Windows.Markup.XamlParseException&#39;:&#34;在&#39; System.Windows上提供值.Markup.StaticResourceHolder&#39;&#34)。我需要帮助提供对StaticResource的正确引用,我无法弄明白。

尝试通过ParserContext提供正确的命名空间/引用(见上文),但显然我做错了。如果我从XAML中检索ObjectDataProvider并将其添加到应用程序的全局资源(Application.Current.Resources.Add()),一切正常。但在我看来,我应该能够直接引用XAML资源。

有问题的转换器是在用户控件中定义的(与DataTemplate最初相同的一个,因此DT没有问题找到它):

<UserControl x:Class="MyProgram.View.CollectibleDetail"
             [...] >
    <UserControl.Resources>
    <ObjectDataProvider x:Key="collectibleTypeFromEnum" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="model:ECollectibleType"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</UserControl.Resources>

1 个答案:

答案 0 :(得分:2)

StaticResource不支持转发引用。您可以将资源添加到Application.Current.Resources以使其在整个应用程序中可用,也可以使用{DynamicResource}

string template = @"<DataTemplate >
                    <StackPanel>        
                        <ComboBox ItemsSource=""{DynamicResource collectibleTypeFromEnum}"" />              
                    </StackPanel>
                </DataTemplate>";