我正在使用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>
答案 0 :(得分:2)
StaticResource
不支持转发引用。您可以将资源添加到Application.Current.Resources
以使其在整个应用程序中可用,也可以使用{DynamicResource}
:
string template = @"<DataTemplate >
<StackPanel>
<ComboBox ItemsSource=""{DynamicResource collectibleTypeFromEnum}"" />
</StackPanel>
</DataTemplate>";