鉴于:

  1. DataTemplates不能分配的目标类型
  2. 否则的引用可以仅仅参考以前

如何做一个模板以下情况下在一个树视图?

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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top