如果我有一个未分类的集合,是否有一种简单的方法来绑定和排序它。我想在XAML中做到这一点(没有Linq,没有C#)
如果我的DataContext有一个属性,比如MyItems,很容易绑定它:
<ListBox ItemsSource={Binding MyItems}/>
但是,我也想对它进行排序。使用CollectionViewSource应该是解决方案,但它对我不起作用:
<ListBox>
<ListBox.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source={Binding MyItems}/>
</Binding.Source>
</Binding>
</ListBox.ItemsSource>
</ListBox>
此时,我的ListBox丢失了它的元素。 我错过了一些明显的东西吗?
答案 0 :(得分:11)
您可以将CollectionViewSource
定义为资源并提供所需的排序......
<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>
scm
命名空间为xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
答案 1 :(得分:0)
在CodeBehind中创建一个CollectionViewSource,从MyItems读取,并将ListBox绑定到
<ListBox ItemsSource="{Binding MyCollectionViewSource"} />
答案 2 :(得分:0)
其他答案都没有实际解决排序问题。它们都是关于CollectionViewSource
的,但您可以使用CollectionViewSource.SortDescription
来进行排序。摘自here并修改:
<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>
在此示例中,CityName
将是用于进行排序的MyItems
中每个项目的属性