如果我有一个未排序的集合,是否有一种简单的方法来绑定和排序它。我想用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失去了它的元素。我错过了什么明显的东西吗? 您可以将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"
在CodeBehind中创建一个从MyItems读取的CollectionViewSource,并将你的ListBox绑定到这个
<ListBox ItemsSource="{Binding MyCollectionViewSource"} />
其他答案实际上都没有涉及排序。他们对CollectionViewSource
都是正确的,但是你可以用CollectionViewSource.SortDescription
来做排序。从这里摘取并修改:
<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
中用于排序的每个项的属性