我发现的唯一合理的解决方案是创建第三个ViewModel类型,该类型将包装前两个类型(资源或属性)中的任何一个,并提供要绑定到的公共属性:(例如,children)。不过,如果这两种类型需要非常不同的模板,这仍然不是很理想,因为此时,我正在使用
VisualStateManager
在数据的模板之间切换。
<HierarchicalDataTemplate x:Key="TreeItemTemplate"
ItemSource="{Binding Children}">
<ContentPresenter Content="{Binding}">
<VisualStateManager.Groups>
<VisualStateGroup>
<VisualState Name="IsResource">
<!-- set resource template -->
</VisualState>
<VisualState Name="IsProperty">
<!-- set property template -->
</VisualState>
</VisualStateGroup>
</VisualStateManager.Groups>
</ContentPresenter>
</HierarchicalDataTemplate>