Domanda

Premesso che:

      
  1. DataTemplates non possono essere assegnati TargetType   
  2. riferimenti StaticResource possono solo fare riferimento in precedenza

Come si fa a modello la seguente situazione in un TreeView?

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

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

Questa struttura si presta bene ad un albero che sarebbe simile:

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

Questa sarebbe banale per modello in WPF a causa della proprietà di TargetType HierarchicalDataTemplate. In Silverlight, avremmo dovuto fare qualcosa di più simile a:

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

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

Il che, ovviamente, non può lavoro perché non può ResourceTemplate riferimento PropertyTemplate perché è definito dopo che nel documento XAML. Quindi, come si fa a risolvere questo problema di pollo e uova?

È stato utile?

Soluzione

L'unica soluzione ragionevole che ho trovato è quello di creare un terzo tipo ViewModel che avvolgere uno dei primi due tipi di risorse (o di proprietà) e di fornire proprietà comuni di legarsi a: (per esempio bambini). Questo non è ancora molto ottimale, però, se i due tipi hanno bisogno di modelli molto diversi, perché a quel punto, sto usando la VisualStateManager per passare da modelli per i dati.

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top