2009-08-14 11 views
36

ListBoxで文字列をソートする必要がありますが、DataContextで別のコンポーネントによってビューモデルにバインドされています。だからObjectDataProviderを使用するthis exampleのように、XAMLでビューモデルを直接インスタンス化することはできません。私のXAMLでListBoxをXAMLのみでコードビハインドなしで並べ替えるにはどうすればよいですか?

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

私の見解モデルでは:別のコンポーネントで

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

view.DataContext = new ViewModel(); 

の背後にはコードがありません!したがって、純粋にXAMLを使用して、どのようにListBoxの項目を並べ替えるのですか?ここでも、XAMLはビューモデルのインスタンス化を所有していません。

答えて

80

は使用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}}"/> 

あなたがより簡単に並べ替え動作を適用することができるようにカスタムVMのクラスであなたの文字列をラップすることがあります。

+1

ありがとう、ケント! CollectionViewSourceのSource属性をバインドすることは、私の欠けているリンクでした。それは有り難いです。この場合、私はカスタムVMクラスを望んでいなかったので、私はちょうど良い文字列コレクションのために明らかに働くPropertyName属性を残しました。 –

+4

また、そこにいる見物人には、SortDescriptionタグはDirection属性を取ります。 –

+3

ListBoxがアイテムのリストであるオブジェクトのプロパティを表すDataTemplateの一部である場合はどうなりますか? ListBox内の並べ替えをどうにかできないのですか? –

関連する問題