鉴于:
如何在TreeView中模拟以下情况?
class Resource {
public string Name {get;}
public IEnumerable<Property> Properties {get;}
}
class Property {
public string Name {get;}
public IEnumerable<Resource> Values {get;}
}
这种结构非常适合树状结构:
Resource 1
|- Property A
| - Resource 2
| - Resource 3
|- Property B
|- Resource 4
由于TargetType
的{{1}}属性,这对于WPF中的模板来说是微不足道的。在Silverlight中,我们必须做更多的事情:
HierarchicalDataTemplate
这显然无效,因为<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
无法引用ResourceTemplate
,因为它是在XAML文档中定义的。那么,你如何解决这个鸡蛋问题?
答案 0 :(得分:0)
我发现的唯一合理的解决方案是创建第三个ViewModel类型,它将包装前两种类型(Resource或Property)中的任何一种,并提供绑定到的公共属性:(例如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>