2009-08-14 24 views
36

Necesito ordenar las cadenas en un ListBox, pero está vinculado al modelo de vista por otro componente a través del DataContext. Así que no puedo instanciar directamente el modelo de vista en XAML, como en this example, que usa el ObjectDataProvider.¿Cómo puedo ordenar un ListBox utilizando solo XAML y sin código subyacente?

En mi XAML:

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

En mi modelo de vista:

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

En otro componente:

view.DataContext = new ViewModel(); 

No hay código detrás! Entonces, usando puramente XAML, ¿cómo ordenaría los elementos en el ListBox? Nuevamente, el XAML no posee la creación de instancias del modelo de vista.

Respuesta

80

Utilice 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}}"/> 

Es posible que desee para envolver sus cadenas en una clase de máquina virtual personalizada para que pueda aplicar más fácilmente comportamiento de ordenación.

+1

¡Gracias, Kent! La vinculación del atributo Fuente en un CollectionViewSource fue el eslabón perdido para mí. Lo aprecio. En este caso, no quería una clase VM personalizada, así que dejé el atributo PropertyName, que aparentemente funciona bien para colecciones de cadenas. –

+4

Además, para cualquier espectador, la etiqueta SortDescription toma un atributo Dirección. –

+3

¿Qué pasa si el ListBox es una parte de un DataTemplate que representa una propiedad de un objeto que es una lista de elementos? ¿No puedo hacer la clasificación dentro de ListBox de alguna manera? –

Cuestiones relacionadas