如何创建两个HierarchicalDataTemplates相互参照在Silverlight?
-
25-09-2019 - |
题
鉴于:
- DataTemplates不能分配的目标类型
- 否则的引用可以仅仅参考以前
如何做一个模板以下情况下在一个树视图?
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
这将微不足道的模板在WPF因为 TargetType
酒店的 HierarchicalDataTemplate
.在Silverlight,我们必须做更多的东西,如:
<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
这显然不能工作是因为 ResourceTemplate
不可以参考 PropertyTemplate
因为它是定义的后在XAML文件。那么,你如何解决这个鸡和蛋的问题?
解决方案
唯一合理的解决方案,我们发现的是创建一个第三视图模型的类型将其包裹的前两个类型(资源或财产),并提供共同性结合:(例如儿童)。这仍然是非常不佳,不过,如果两种类型需要非常不同的模板,因为在这一点上,我用的 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>
不隶属于 StackOverflow