J'ai vu ICollectionView être introduit avec WPF pour gérer les situations où vous avez besoin de tri et de filtrage activé. J'ai même vu quelques articles qui trient des articles, mais ma principale préoccupation est de savoir pourquoi mon approche échoue. Voyons mon code:ICollectionView problème de tri dans ListView
<ListView ItemsSource="{Binding}" x:Name="lvItems" GridViewColumnHeader.Click="ListView_Click">
<ListView.View>
<GridView AllowsColumnReorder="True">
<GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}" />
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Developer">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Developer}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Salary">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Salary}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
En codebehind, lorsque l'élément est cliqué que je fais comme ceci:
ICollectionView Source { get; set; }
private void ListView_Click(object sender, RoutedEventArgs e)
{
GridViewColumnHeader currentHeader = e.OriginalSource as GridViewColumnHeader;
if(currentHeader != null && currentHeader.Role != GridViewColumnHeaderRole.Padding)
{
//using (this.Source.DeferRefresh())
//{
SortDescription currentPropertySort = this.Source.SortDescriptions.FirstOrDefault<SortDescription>(item => item.PropertyName.Equals(currentHeader.Column.Header.ToString()));
if (currentPropertySort != null)
{
if (currentPropertySort.Direction == ListSortDirection.Ascending)
currentPropertySort.Direction = ListSortDirection.Descending;
else
currentPropertySort.Direction = ListSortDirection.Ascending;
}
else
this.Source.SortDescriptions.Add(new SortDescription(currentHeader.Column.Header.ToString(), ListSortDirection.Ascending));
//}
this.Source.Refresh();
this.lvItems.DataContext = this.Source;
this.lvItems.UpdateLayout();
}
}
Alors chaque fois que l'en-tête pour la zone de liste est cliqué, l'élément doivent être triés. Je maintiens la collection en utilisant une propriété appelée Source, puis en l'utilisant en appelant lvItems.DataContext = this.Source. Mais le code ne semble pas fonctionner.
Une aide? J'ai également téléchargé le code http://cid-bafa39a62a57009c.office.live.com/self.aspx/.Public/CollectionviewSourceSample.zip
Pour tous les téléspectateurs de ce post, j'ai déjà implémenté cela. Si vous voulez voir jeter un oeil: http://www.abhisheksur.com/2010/08/woring-with-icollectionviewsource-in.html Merci – abhishek