如何对集合进行绑定和排序



如果我有一个未排序的集合,是否有一种简单的方法来绑定和排序它。我想用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中用于排序的每个项的属性

相关内容

  • 没有找到相关文章

最新更新