在XAML中转发声明以解决DataTemplate的循环依赖性

时间:2013-09-27 14:50:13

标签: c# wpf xaml hierarchicaldatatemplate datatemplateselector

我想将HierarchicalDataTemplate与DataTemplateSelector一起使用但是我遇到了顺序问题:

<UserControl.Resources>
    <HierarchicalDataTemplate x:Key="TemplateA"
                              ItemsSource="{Binding AnySource}"
                              ItemTemplateSelector="{StaticResource MyTemplateSelector}" >
        <Label Content="A" />
    </HierarchicalDataTemplate>

    <DataTemplate x:Key="TemplateB">
        <Label Content="B" />
    </DataTemplate>

    <viewmodel:MyTemplateSelector 
        TemplateA="{StaticResource TemplateA}" 
        TemplateB="{StaticResource TemplateB}" 
        x:Key="MyTemplateSelector" />

    <HierarchicalDataTemplate x:Key="TemplateC"
                              ItemsSource="{Binding AnotherSource}"
                              ItemTemplateSelector="{StaticResource MyTemplateSelector}">
        <Label Content="C" />
    </HierarchicalDataTemplate>
</UserControl.Resources>
<Grid>
    <TreeView 
        ItemsSource="{Binding Source={StaticResource SomeList}}"
        ItemTemplate="{StaticResource TemplateC}"/>
</Grid>

MyTemplateSelector依赖于TemplateA,而TemplateA依赖于MyTemplateSelector。我在运行时得到一个System.Windows.Markup.XamlParseException。在XAML中有没有一种前瞻性声明的方法,还是有不同的解决方案?

解决方案: 我找到了解决方案:我不需要在TemplateA中设置TemplateSelector,因为它是在父DataTemplate中设置的。有时它可以这么简单......

1 个答案:

答案 0 :(得分:3)

[似乎你通过不加载资源克服了这个问题。我仍然会为未来的读者发布答案]

您可以使用DynamicResource代替StaticResource

这仅适用于填充依赖项属性,即Binding.Converter="{DynamicResource MyConverter}"不起作用,因为Binding.Converter不是依赖项属性。