2009-08-14 5 views
36

J'ai besoin de trier les chaînes dans un ListBox, mais il est lié au modèle de vue par un autre composant via le DataContext. Donc, je ne peux pas instancier directement le modèle de vue en XAML, comme dans this example, qui utilise le ObjectDataProvider.Comment puis-je trier un ListBox en utilisant seulement XAML et aucun code-behind?

Dans mon XAML:

<ListBox ItemsSource="{Binding CollectionOfStrings}" /> 

Dans mon modèle de vue:

public ObservableCollection<string> CollectionOfStrings 
{ 
    get { return collectionOfStrings; } 
} 

Dans un autre composant:

view.DataContext = new ViewModel(); 

Il n'y a pas de code derrière! Donc, en utilisant purement XAML, comment pourrais-je trier les éléments dans le ListBox? Encore une fois, le XAML ne possède pas l'instanciation du modèle de vue.

Répondre

80

Utilisez un CollectionViewSource:

<CollectionViewSource x:Key="SortedItems" Source="{Binding CollectionOfStrings}" 
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=Win‌​dowsBase"> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="SomePropertyOnYourItems"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

<ListBox ItemsSource="{Binding Source={StaticResource SortedItems}}"/> 

Vous pouvez envelopper vos chaînes dans une classe VM personnalisée de sorte que vous pouvez appliquer plus facilement le comportement de tri.

+1

Merci, Kent! La liaison de l'attribut Source sur une CollectionViewSource était le lien manquant pour moi. Je vous en suis reconnaissant. Dans ce cas, je ne voulais pas de classe VM personnalisée, donc je viens de quitter l'attribut PropertyName, qui fonctionne apparemment bien pour les collections de chaînes. –

+4

En outre, pour tous les spectateurs, la balise SortDescription prend un attribut Direction. –

+3

Que faire si le ListBox fait partie d'un DataTemplate représentant une propriété d'un objet qui est une liste d'éléments. Je ne peux pas faire le tri à l'intérieur de la ListBox en quelque sorte? –

Questions connexes