1

鉴于:

  1. 数据模板不能由 TargetType 分配
  2. StaticResource 引用只能引用以前

如何在 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_ 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 文档中定义的。那么,如何解决这个先有鸡还是先有蛋的问题呢?

4

1 回答 1

0

我发现的唯一合理的解决方案是创建第三个 ViewModel 类型,它将包装前两种类型(资源或属性)中的任何一个,并提供要绑定到的通用属性:(例如子级)。但是,这仍然不是非常理想,如果这两种类型需要非常不同的模板,因为那时我正在使用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>
于 2010-09-27T15:53:44.213 回答