代码之家  ›  专栏  ›  技术社区  ›  MojoFilter

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

  •  1
  • MojoFilter  · 技术社区  · 14 年前

    1. 无法按TargetType分配数据模板
    2. StaticResource引用只能引用以前的

    如何在树视图中创建以下情况的模板?

    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

    <HierarchicalDataTemplate x:Key="ResourceTemplate"
                              ItemSource="{Binding Properties}"
                              ItemTemplate={StaticResource PropertyTemplate}" />
    
    <HierarchicalDataTemplate x:Key="PropertyTemplate"
                              ItemSource="{Binding Values}"
                              ItemTemplate="{StaticResource ResourceTemplate}" />
    

    这显然是行不通的,因为 ResourceTemplate 无法引用 PropertyTemplate 因为它是在XAML文档中定义的。那么,如何解决这个鸡和蛋的问题呢?

    1 回复  |  直到 14 年前
        1
  •  0
  •   MojoFilter    14 年前

    我发现的唯一合理的解决方案是创建第三个ViewModel类型,该类型将包装前两个类型(资源或属性)中的任何一个,并提供要绑定到的公共属性:(例如,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>