如何绑定和排序集合

时间:2011-04-07 17:42:12

标签: wpf data-binding

如果我有一个未分类的集合,是否有一种简单的方法来绑定和排序它。我想在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丢失了它的元素。 我错过了一些明显的东西吗?

3 个答案:

答案 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中每个项目的属性