Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF ListView group and sort

Tags:

c#

listview

wpf

I'm trying to group items on my list and sort them from oldest to newest. Grouping works perfect, it just doesn't want to inverse this list.

WPF Code:

            <ListView x:Name="lst_orders" Margin="5" GridViewColumnHeader.Click="results_Click">
            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Style.Triggers>
                        <Trigger Property="IsKeyboardFocusWithin" Value="true">
                            <Setter Property="IsSelected" Value="true" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.Resources>
            <ListView.View>
                <GridView>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button x:Name="goto_parts" Content="Show parts" Width="AUTO" Padding="2" Margin="2" Background="#FF179917" Click="goto_parts_Click"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Order ID" Width="100" DisplayMemberBinding="{Binding fullOrderId}" />
                    <GridViewColumn Header="Job Status" Width="100" DisplayMemberBinding="{Binding status}" />
                    <GridViewColumn Header="Order Type" Width="150" DisplayMemberBinding="{Binding orderType}" />
                    <GridViewColumn Header="Customer Notes" Width="250" DisplayMemberBinding="{Binding notes}" />
                    <GridViewColumn Header="Admin Notes" Width="250" DisplayMemberBinding="{Binding adminNotes}" />
                    <GridViewColumn Header="Production Notes" Width="100" DisplayMemberBinding="{Binding production_notes}" />
                </GridView>
            </ListView.View>
            <ListView.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Background="Gray">
                                <TextBlock Text="Days: " FontSize="18" FontWeight="Bold"/>
                                <TextBlock Text="{Binding Name}" FontSize="18" FontWeight="Bold"/>
                                <TextBlock Text=" Systems: " FontSize="18" FontWeight="Bold"/>
                                <TextBlock Text="{Binding ItemCount}" FontSize="18" FontWeight="Bold"/>
                            </StackPanel>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                </GroupStyle>
            </ListView.GroupStyle>
        </ListView>

C# Code:

        ICollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lst_orders.ItemsSource);
        PropertyGroupDescription groupDescription = new PropertyGroupDescription("daysOld");

        view.GroupDescriptions.Add(groupDescription);
        view.SortDescriptions.Add(new SortDescription("daysOld", ListSortDirection.Descending));

        lst_orders.ItemsSource = view;

daysOld is a property that calculates difference between today's date and order date, works perfect, but I want to see it from the highest number to the lowest. Picture shows what I get, and I want to reverse it.

enter image description here

like image 546
arti Avatar asked Sep 01 '26 03:09

arti


1 Answers

Your code is correct.I've made a test. It is possible to see in view:

C#:

List<SomeClass> list = new List<SomeClass>();
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{              
   list.Add(new SomeClass() { DaysOld = DateTime.Now.Add(new TimeSpan(0, rnd.Next(25), 0))});
}
ICollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(list);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("daysOld");
view.GroupDescriptions.Add(groupDescription);
view.SortDescriptions.Add(new SortDescription("DaysOld",   ListSortDirection.Descending));
listBox.ItemsSource = view;
listBox.DisplayMemberPath = "DaysOld";

XAML:

<ListBox Name="listBox"/>        

Model:

public class SomeClass
{
    public DateTime DaysOld { get; set; }
}

Image:

enter image description here

like image 154
StepUp Avatar answered Sep 03 '26 17:09

StepUp