2012-04-19 8 views
5

Ich versuche, ein ItemsControl zu erstellen, das mit der Anzeige verschiedener Elemente nach Metadaten sortiert ist. Jedes Element kann mehrere Metadaten enthalten. Zum Beispiel könnte ein Element vom Typ "Conversation" die Metadaten "Chapter", "Act" und "Volume" enthalten.WPF - Gruppenstile: Können wir nur an die Eigenschaft "Name" binden?

Bei der Suche, wie die Gruppierung in WPF funktioniert, habe ich über GroupStyles und die PropertyGroupDescription-Klasse herausgefunden.

Ich habe meine eigene Klasse erstellt, die von PropertyGroupDescription erbt und ein Objekt vom Typ "Metadata" zurückgibt.

Gibt es trotzdem, dass ich in meiner GroupsStyle DataTemplate ItemsControl an das zurückgegebene Objekt (d. H. Das "Metadata" -Objekt) binden und dann seine Eigenschaften anzeigen kann, wie ich es wünsche? Oder muss ich mich an "Name" binden?

Mit anderen Worten:

<ItemsControl.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.HeaderTemplate> 
      <DataTemplate> 
        Am I forced to bind to "Name" here ? 
      </DataTemplate> 
     </GroupStyle.HeaderTemplate> 
    </GroupStyle> 
</ItemsControl.GroupStyle> 

Antwort

13

standardmäßig DataContext in GroupStyle können Sie auf diese CollectionViewGroup Properties binden. Aber natürlich können Sie andere BindingSource setzen, wenn Sie brauchen.

Wenn Sie das erste Objekt in der Gruppe verwenden möchten:

<TextBlock Text="{Binding Path=Items[0].YourStringProperty}" /> 
+1

Aber Einzelteile ist das Array der Elemente und nicht des Groupdescription-Objekt. I.e. Die Eigenschaft 'Metadata' bleibt unzugänglich? – Dani

0

standardmäßig, wenn sie benutzerdefiniertes Objekt zu tun zu binden, wird es versuchen, Display sein ToString() Methode verwendet wird, ist nicht der Name (na ja, ToString() druckt den Namen von Standard sowieso). Sie können Overset ToString() Methode versuchen, etwas anderes zu drucken, Sie werden sehen, was ich meine.

Aber natürlich können Sie Ihre eigene DataTemplate definieren und an verschiedene Eigenschaften binden.

<DataTemplate> 
<TextBlock Text="{Binding XXXXX}"/> 
</DataTemplate> 
Verwandte Themen