开发者

How can I bind and sort a collection

If I have an unsorted collection, is there an easy way to bind and sort it. I would like to do it in XAML (no Linq, no C#)

If my DataContext has a property, say, MyItems, it is easy to bind against it:

<ListBox ItemsSource={Binding MyItems}/>

However, I'd like to sort it as well. Using the CollectionViewSource should be the solution but it does not work for me:

<开发者_运维技巧;ListBox>
 <ListBox.ItemsSource>
  <Binding>
   <Binding.Source>
    <CollectionViewSource Source={Binding MyItems}/>
   </Binding.Source>
  </Binding>
 </ListBox.ItemsSource>
</ListBox>

At this point, my ListBox loses its elements. Am I missing something obvious?


You can define the CollectionViewSource as a resource and provide your desired sorting...

<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>

The scm namespace is xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"


Create a CollectionViewSource in the CodeBehind which reads from MyItems, and bind your ListBox to that

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


Neither of the other answers actually address sorting. They are both right about a CollectionViewSource, but you can use that to do the sorting, with CollectionViewSource.SortDescription. Taken from here and modified:

<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>

In this example,CityName would be the property on each item in MyItems used to do the sorting

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜