如何仅使用XAML对ListBox进行排序而不进行代码隐藏?

Ebe*_*eer 38 sorting wpf xaml listbox mvvm

我需要在a中对字符串进行排序ListBox,但它通过另一个组件绑定到视图模型DataContext.所以我不能直接在XAML中实例化视图模型,就像在这个例子中一样,它使用了ObjectDataProvider.

在我的XAML中:

<ListBox ItemsSource="{Binding CollectionOfStrings}" />
Run Code Online (Sandbox Code Playgroud)

在我的视图模型中:

public ObservableCollection<string> CollectionOfStrings
{
    get { return collectionOfStrings; }
}
Run Code Online (Sandbox Code Playgroud)

在另一个组件中:

view.DataContext = new ViewModel();
Run Code Online (Sandbox Code Playgroud)

没有代码背后!所以使用纯XAML,我如何对ListBox中的项进行排序?同样,XAML不拥有视图模型的实例化.

Ken*_*art 84

使用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}}"/>
Run Code Online (Sandbox Code Playgroud)

您可能希望将字符串包装在自定义VM类中,以便更轻松地应用排序行为.

  • 评论人[franssu](http://stackoverflow.com/users/414314/franssu):`scm`包含WindowsBase程序集中的"System.ComponentModel"命名空间.`(XMLNS:SCM = "CLR-命名空间:System.ComponentModel程序;装配= WindowsBase")` (43认同)
  • 此外,对于任何旁观者,SortDescription标记采用Direction属性. (4认同)
  • 如果ListBox是DataTemplate的一部分,表示作为项列表的对象的属性,该怎么办?我不能以某种方式在ListBox中进行排序吗? (3认同)
  • 你能告诉我们smc命名空间的位置吗?我没有成功使用Xaml找到SortDescription. (2认同)