1

とすれば:

  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のプロパティがあるため、これはWPFのテンプレートでは簡単ですHierarchicalDataTemplate。Silverlightでは、次のようなことを行う必要があります。

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

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

XAMLドキュメントで定義されているため、ResourceTemplate参照できないため、明らかに機能しません。PropertyTemplateでは、この鶏が先か卵が先かという問題をどのように解決しますか?

4

1 に答える 1

0

私が見つけた唯一の合理的な解決策は、最初の2つのタイプ(ResourceまたはProperty)のいずれかをラップし、バインドする共通のプロパティ(子など)を提供する3番目のViewModelタイプを作成することです。ただし、これはまだあまり最適ではありませんが、2つのタイプで非常に異なるテンプレートが必要な場合は、その時点でを使用し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 に答える