2011-04-07 3 views
4

Si j'ai une collection non triée, existe-t-il un moyen facile de la lier et de la trier? Je voudrais le faire en XAML (pas Linq, pas C#)Comment lier et trier une collection

Si mon DataContext a une propriété, par exemple, MyItems, il est facile de se lier contre:

<ListBox ItemsSource={Binding MyItems}/> 

Cependant, je tiens à le trier aussi bien. Utilisation de la CollectionViewSource devrait être la solution, mais il ne fonctionne pas pour moi:

<ListBox> 
<ListBox.ItemsSource> 
    <Binding> 
    <Binding.Source> 
    <CollectionViewSource Source={Binding MyItems}/> 
    </Binding.Source> 
    </Binding> 
</ListBox.ItemsSource> 
</ListBox> 

A ce moment, mon ListBox perd ses éléments. Est-ce que je manque quelque chose d'évident?

Répondre

8

Vous pouvez définir la CollectionViewSource comme une ressource et fournir votre tri désiré ...

<Window.Resources> 
    <CollectionViewSource x:Key="cvs" Source="{Binding MyItems}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="MyItemName" Direction="Ascending"/> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 
<Grid> 
    <ListBox ItemsSource="{Binding Source={StaticResource cvs}}"/> 
</Grid> 

L'espace de noms scm est xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"

+0

Merci pour votre suggestion. Toutefois, ma zone de liste est dans un DataTemplate, donc je ne peux pas utiliser une ressource. Pourquoi cela fonctionne-t-il comme une ressource et non comme une source de la liaison? – user380719

+0

Ahh votre réponse originale n'avait pas les SortDescriptions, donc j'ai répondu avec, et vous avez édité pour inclure – xdumaine

0

Créer un CollectionViewSource dans le CodeBehind qui se lit de MyItems, et lier votre ListBox à cette

<ListBox ItemsSource="{Binding MyCollectionViewSource"} /> 
+0

-1 OP stipule expressément qu'ils veulent éviter C# (code derrière) –

+2

Pas digne d'un -1. Bien sûr, le PO a dit cela, mais les personnes futures cherchant des réponses à cela pourraient trouver la contribution de @ Rachel précieuse. – Robaticus

+0

@Robaticus Tout le monde se déforme sur -1. Puisque le PO a explicitement déclaré qu'aucun C# ne devait être utilisé; la ligne doit être tracée quelque part. Si le PO n'a pas explicitement appelé à ne pas vouloir utiliser C#, la réponse serait correcte. Essayer de garder les réponses relatives à la question est tout. –

0

Aucune des autres réponses n'adressent réellement le tri. Ils ont tous les deux raison sur un CollectionViewSource, mais vous pouvez l'utiliser pour faire le tri, avec CollectionViewSource.SortDescription. Taken de here et modifié:

<Window.Resources> 

    <src:MyItems x:Key="MyItems"/> 

    <CollectionViewSource Source="{StaticResource MyItems}" x:Key="cvs"> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="CityName"/> 
    </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

<ListBox ItemsSource="{Binding Source={StaticResource cvs}}" 
    DisplayMemberPath="CityName" Name="lb"> 
    <ListBox.GroupStyle> 
    <x:Static Member="GroupStyle.Default"/> 
    </ListBox.GroupStyle> 
</ListBox> 

Dans cet exemple, CityName serait la propriété sur chaque élément MyItems utilisé pour faire le tri

+0

ummm ... ma réponse ne parle de SortDescriptions. –

+0

@Aaron - ce n'était pas le cas lorsque j'ai chargé la page pour la première fois. Vous avez modifié pour inclure. Bien sûr, les modifications dans les premières minutes d'un post ne s'affichent pas comme des modifications, donc je ne peux pas le prouver. – xdumaine

Questions connexes