2009-08-14 18 views
36

Dizeleri ListBox içinde sıralamalıyım, ancak görünüm modeline DataContext aracılığıyla başka bir bileşen tarafından bağlanmıştır. Bu nedenle, ObjectDataProvider'u kullanan this example'daki gibi XAML'deki görünüm modelini doğrudan oluşturamıyorum. Benim XAML olarakListBox'ı yalnızca XAML kullanarak ve arkada kod yokken nasıl sıralayabilirim?

:

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

benim bakış modelinde:

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

başka bileşeninde:

view.DataContext = new ViewModel(); 

arkasında hiç kod yoktur! Tamamen XAML kullanarak, ListBox'taki öğeleri nasıl sıralarım? Yine XAML, görünüm modelinin örneğine sahip değildir.

cevap

80

kullanın 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}}"/> 

Sen daha kolay sıralama davranışı uygular kurabilmesi için özel VM sınıfında Dizelerinizi sarmak isteyebilirsiniz.

+1

Teşekkürler, Kent! Source özniteliğini CollectionViewSource üzerinde bağlama, benim için eksik bağlantıydı. Bunu takdir ediyorum. Bu durumda, özel bir VM sınıfı istemedim, bu yüzden sadece dize koleksiyonları için gayet iyi çalışan PropertyName özniteliğini bıraktım. –

+4

Ayrıca, herhangi bir izleyiciye orada, SortDescription etiketi bir yön özniteliği alır. –

+3

ListBox, bir öğe listesi olan bir nesnenin bir özelliğini temsil eden bir DataTemplate parçasıysa. ListBox'taki sıralama bir şekilde yapamaz mıyım? –