如何在Silverlight中创建两个相互引用的HierarchicalDataTemplate?

时间:2010-09-27 15:47:01

标签: silverlight xaml resourcedictionary hierarchicaldatatemplate

鉴于:

      
  1. TargetType无法分配DataTemplates   
  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的{​​{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文档中定义的。那么,你如何解决这个鸡蛋问题?

1 个答案:

答案 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>