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中设置模板选择器,因为它是在父数据模板中设置的。有时它可以如此简单...
[似乎您通过不加载资源来克服了这个问题。我仍然会为未来的读者发布答案]
您可以使用DynamicResource
而不是StaticResource
。
这仅在填充依赖属性时才有效,即 Binding.Converter="{DynamicResource MyConverter}"
将不起作用,因为Binding.Converter
不是依赖项属性。