Frage

Angesichts dessen:

  1. DataTeMplates kann nicht vom TargetType zugewiesen werden
  2. StaticResource -Referenzen können nur zuvor verweisen

Wie ist eine Vorlage die folgende Situation in einem Treeview?

class Resource {
  public string Name {get;}
  public IEnumerable<Property> Properties {get;}
}

class Property {
  public string Name {get;}
  public IEnumerable<Resource> Values {get;}
}

Diese Struktur eignet sich gut für einen Baum, der aussehen würde:

Resource 1
|- Property A
   | - Resource 2
   | - Resource 3
|- Property B
   |- Resource 4

Dies würde aufgrund der wpF triviale Vorlage in WPF TargetType Eigentum von HierarchicalDataTemplate. In Silverlight müssten wir etwas mehr tun wie:

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

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

Was offensichtlich nicht funktionieren kann, weil ResourceTemplate kann nicht verweisen PropertyTemplate Weil es danach im XAML -Dokument definiert ist. Wie lösen Sie dieses Hähnchen-Ei-Problem?

War es hilfreich?

Lösung

Die einzig vernünftige Lösung, die ich gefunden habe, besteht darin, einen dritten ViewModel -Typ zu erstellen, der eine der ersten beiden Typen (Ressourcen oder Eigenschaft) einwickelt und gemeinsame Eigenschaften anbindet, an die Sie binden können: (z. B. Kinder). Dies ist immer noch nicht sehr optimal, wenn die beiden Typen sehr unterschiedliche Vorlagen benötigen, da ich zu diesem Zeitpunkt die verwende VisualStateManager Um zwischen Vorlagen für die Daten zu wechseln.

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top