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();
}
}