【WPF】버튼 클릭으로 DataGrid의 소트를 초기화한다
개요
DataGrid의 열 머리글 클릭으로 곱한 정렬을 해제하고 기본 정렬로 만들고 싶습니다.
정렬 작업이 많아 여러 번 정렬을 반복 한 후 초기 정렬로 되돌리고 싶지만,
유저에게 기억하고 있어, 헤더를 복수회 클릭해 주어도 되지 않는다.
정렬을 지우는 버튼을 설치하고 클릭하면 초기화됩니다.
방법
샘플 코드
모델
Employee.cs
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public string CompanyName { get; set; }
public string ProjectName { get; set; }
}
ViewModel
MainWindowViewModel.csusing System.Collections.ObjectModel;
using System.Collections.Generic;
public class MainWindowViewModel
{
public ObservableCollection<Employee> Employees { get; set; }
public MainWindowViewModel()
{
this.Employees = new ObservableCollection<Employee>(
new List<Employee>
{
new Employee(){ID=1,Name="涼風青葉",CompanyName="EagleJump",ProjectName="PECO"},
new Employee(){ID=2,Name="八神コウ",CompanyName="EagleJump",ProjectName="FAIRIES STORY"},
new Employee(){ID=3,Name="社畜ちゃん",CompanyName="ブランクソフトウェア",ProjectName="*"}
}
);
}
}
보기
초기화 버튼 클릭으로 ID순으로 정렬하는 예
xaml
MainWindow.xaml
<!-- WindowにComponentModelの参照の追加が必要-->
<Window x:Class="DataGridSortInitialization.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=Windowsbase"
xmlns:local="clr-namespace:DataGridSortInitialization"
mc:Ignorable="d"
Title="MainWindow" Height="370.161" Width="498.79">
<Window.Resources>
<CollectionViewSource x:Key="EmployeesViewSource" Source="{Binding Employees}" >
<CollectionViewSource.SortDescriptions>
<!--デフォルトのソート-->
<ComponentModel:SortDescription PropertyName="ID" Direction="Ascending" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<DataGrid x:Name="EmployeesDataGrid"
DataContext="{Binding Source={StaticResource EmployeesViewSource}}"
ItemsSource="{Binding}"
IsReadOnly="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
Height="263" VerticalAlignment="Top" Margin="0,38,0,0">
</DataGrid>
<Button x:Name="ClearSortButton" Content="ソートの初期化" HorizontalAlignment="Left" VerticalAlignment="Top"
Width="112" Margin="351,6,0,0" Click="ClearSortButton_Click"/>
</Grid>
</Window>
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public string CompanyName { get; set; }
public string ProjectName { get; set; }
}
using System.Collections.ObjectModel;
using System.Collections.Generic;
public class MainWindowViewModel
{
public ObservableCollection<Employee> Employees { get; set; }
public MainWindowViewModel()
{
this.Employees = new ObservableCollection<Employee>(
new List<Employee>
{
new Employee(){ID=1,Name="涼風青葉",CompanyName="EagleJump",ProjectName="PECO"},
new Employee(){ID=2,Name="八神コウ",CompanyName="EagleJump",ProjectName="FAIRIES STORY"},
new Employee(){ID=3,Name="社畜ちゃん",CompanyName="ブランクソフトウェア",ProjectName="*"}
}
);
}
}
<!-- WindowにComponentModelの参照の追加が必要-->
<Window x:Class="DataGridSortInitialization.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=Windowsbase"
xmlns:local="clr-namespace:DataGridSortInitialization"
mc:Ignorable="d"
Title="MainWindow" Height="370.161" Width="498.79">
<Window.Resources>
<CollectionViewSource x:Key="EmployeesViewSource" Source="{Binding Employees}" >
<CollectionViewSource.SortDescriptions>
<!--デフォルトのソート-->
<ComponentModel:SortDescription PropertyName="ID" Direction="Ascending" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<DataGrid x:Name="EmployeesDataGrid"
DataContext="{Binding Source={StaticResource EmployeesViewSource}}"
ItemsSource="{Binding}"
IsReadOnly="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
Height="263" VerticalAlignment="Top" Margin="0,38,0,0">
</DataGrid>
<Button x:Name="ClearSortButton" Content="ソートの初期化" HorizontalAlignment="Left" VerticalAlignment="Top"
Width="112" Margin="351,6,0,0" Click="ClearSortButton_Click"/>
</Grid>
</Window>
코드 비하인드
MainWindow.xaml.cs
using System.Linq;
using System.Windows;
using System.Windows.Data;
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
private readonly string _viewSourceKey = "EmployeesViewSource";
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
private void ClearSortButton_Click(object sender, RoutedEventArgs e)
{
// 各ColumnHeaderのSortDirectionをクリアする
this.EmployeesDataGrid.Columns.ToList().ForEach(c => c.SortDirection = null);
// DataGridのDataContextを再設定する
this.EmployeesDataGrid.DataContext = null;
this.EmployeesDataGrid.DataContext = this.FindResource(this._viewSourceKey) as CollectionViewSource;
}
}
동작 예
요약
코드 숨김에는 약간의 설명이 있지만 CollectionViewSource를 사이에 꽂으면 ViewModel과 View 조인을 희소하게 유지하면서 정렬 초기화를 실현할 수있었습니다.
오히려 ViewModel을 괴롭히고 어떻게든 하려고 하면 순간에 생각하지 않으면 안 되는 것이 늘어날 것 같은 생각이 듭니다.
뭔가 다른 좋은 실현 방법이 있으면 코멘트를 주시면 감사하겠습니다.
Reference
이 문제에 관하여(【WPF】버튼 클릭으로 DataGrid의 소트를 초기화한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/2ndponpu/items/977bdca62f23e6bb0c45
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
코드 숨김에는 약간의 설명이 있지만 CollectionViewSource를 사이에 꽂으면 ViewModel과 View 조인을 희소하게 유지하면서 정렬 초기화를 실현할 수있었습니다.
오히려 ViewModel을 괴롭히고 어떻게든 하려고 하면 순간에 생각하지 않으면 안 되는 것이 늘어날 것 같은 생각이 듭니다.
뭔가 다른 좋은 실현 방법이 있으면 코멘트를 주시면 감사하겠습니다.
Reference
이 문제에 관하여(【WPF】버튼 클릭으로 DataGrid의 소트를 초기화한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/2ndponpu/items/977bdca62f23e6bb0c45텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)