WPF

[ wpf ] listview column sort

code094 2023. 1. 4. 12:30

1. xaml 에서 헤더 클릭 이벤트 설정해줌

       <GridViewColumnHeader Content="python" Click="ColumnHeaderClickHandler"/>

2. ColumnHeaderClickHandler 정의함

3. Sort 함수 정의

xaml

 <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="0.5*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="3*"/>
        </Grid.RowDefinitions>
        <ListView Grid.Row="1" Grid.ColumnSpan="3" Grid.RowSpan="2" Margin="5" Name="sListView">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn DisplayMemberBinding="{Binding name}"  Width="50">
                            <GridViewColumnHeader Content="name" Click="ColumnHeaderClickHandler"/>
                        </GridViewColumn>
                        <GridViewColumn DisplayMemberBinding="{Binding age}"  Width="50">
                            <GridViewColumnHeader Content="age" Click="ColumnHeaderClickHandler"/>
                        </GridViewColumn>
                        <GridViewColumn DisplayMemberBinding="{Binding java}" Width="50">
                            <GridViewColumnHeader Content="java" Click="ColumnHeaderClickHandler"/>
                        </GridViewColumn>
                        <GridViewColumn DisplayMemberBinding="{Binding csharp}" Width="50">
                            <GridViewColumnHeader Content="csharp" Click="ColumnHeaderClickHandler"/>
                        </GridViewColumn>
                        <GridViewColumn DisplayMemberBinding="{Binding python}" Width="50">
                            <GridViewColumnHeader Content="python" Click="ColumnHeaderClickHandler"/>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

c# 

public partial class MainWindow : Window
    {
        List<Student> students = null;

        public MainWindow()
        {
            InitializeComponent();

            students = new List<Student>();
            students.Add(new Student() { name = "jin", csharp = 100, java = 60, python = 70, age = 20 });
            students.Add(new Student() { name = "sin", csharp = 40, java = 30, python = 70, age = 20 });
            students.Add(new Student() { name = "young", csharp = 30, java = 80, python = 65, age = 20 });
            students.Add(new Student() { name = "kim", csharp = 65, java = 70, python = 70, age = 20 });
            students.Add(new Student() { name = "song", csharp = 90, java = 60, python = 100, age = 20 });

            sListView.ItemsSource = students;
        }
        //컬럼 정렬 
        GridViewColumnHeader _lastHeaderClicked = null;
        ListSortDirection _lastDirection = ListSortDirection.Ascending;
        private void ColumnHeaderClickHandler(object sender, RoutedEventArgs e)
        {
            var headerClicked = e.OriginalSource as GridViewColumnHeader;
            ListSortDirection direction;
            if (headerClicked != null)
            {
                if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
                {
                    if (headerClicked != _lastHeaderClicked)
                    {
                        direction = ListSortDirection.Ascending;
                    }
                    else
                    {
                        if (_lastDirection == ListSortDirection.Ascending)
                        {
                            direction = ListSortDirection.Descending;
                        }
                        else
                        {
                            direction = ListSortDirection.Ascending;
                        }
                    }
                    var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;


                    var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;
                    Sort(sortBy, direction);


                    // Remove arrow from previously sorted header
                    if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
                    {
                        _lastHeaderClicked.Column.HeaderTemplate = null;
                    }

                    _lastHeaderClicked = headerClicked;
                    _lastDirection = direction;
                }
            }
        }
        private void Sort(string sortBy, ListSortDirection direction)
        {
            ICollectionView dataView = CollectionViewSource.GetDefaultView(sListView.ItemsSource);

            dataView.SortDescriptions.Clear();
            SortDescription sd = new SortDescription(sortBy, direction);
            dataView.SortDescriptions.Add(sd);
            dataView.Refresh();
        }

    }