XAML 中的前向声明,以解决数据模板的循环依赖关系

本文关键字:数据 依赖 关系 解决 循环 声明 XAML | 更新日期: 2023-09-27 18:32:59

我想将 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 中是否有转发声明的方法,或者是否有不同的解决方案?

溶液:我已经找到了解决方案:我不需要在模板A中设置模板选择器,因为它是在父数据模板中设置的。有时它可以如此简单...

XAML 中的前向声明,以解决数据模板的循环依赖关系

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

您可以使用DynamicResource而不是StaticResource

这仅在填充依赖属性时才有效,即 Binding.Converter="{DynamicResource MyConverter}"将不起作用,因为Binding.Converter不是依赖项属性。