2011-04-07 40 views
4

如果我有未排序的集合,是否有一种简单的方法来绑定和排序它。我想这样做在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> 

在这一点上,我的列表框失去它的元素。 我错过了一些明显的东西吗?

回答

8

您可以定义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"

+0

谢谢你的建议。但是,我的列表框位于DataTemplate中,因此我无法使用资源。它为什么作为资源而不是作为绑定的来源? – user380719 2011-04-07 18:27:46

+0

啊你原来的答案没有SortDescriptions,所以我回答了它,你编辑包括 – xdumaine 2011-04-07 18:34:03

0

,其中从MyItems读取代码隐藏创建CollectionViewSource,你的列表框绑定到

<ListBox ItemsSource="{Binding MyCollectionViewSource"} /> 
+0

-1 OP特别指出他们希望避免C#(代码后面) – 2011-04-07 18:10:03

+2

上的每个项目的属性不值得一个-1。 OP确实表示,但未来寻找答案的人可能会发现@ Rachel的投入是有价值的。 – Robaticus 2011-04-07 18:22:37

+0

@Robaticus每个人都在-1上弯曲变形。由于OP明确指出不使用C#,该线必须在某处绘制。如果OP没有明确表示不想使用C#,那么答案会很好。试图保持与问题相关的答案都是。 – 2011-04-07 18:27:40

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用来做分拣

+0

嗯......我的答案确实讨论了SortDescriptions。 – 2011-04-07 18:34:03

+0

@Aaron - 当我第一次加载页面时没有。您已编辑包含。当然,在帖子的前几分钟内编辑并不会显示为编辑,所以我无法证明这一点。 – xdumaine 2011-04-07 18:35:30