【WPF】버튼 클릭으로 DataGrid의 소트를 초기화한다

12798 단어 .NETWPFXamlDataGridC#

개요



DataGrid의 열 머리글 클릭으로 곱한 정렬을 해제하고 기본 정렬로 만들고 싶습니다.
정렬 작업이 많아 여러 번 정렬을 반복 한 후 초기 정렬로 되돌리고 싶지만,
유저에게 기억하고 있어, 헤더를 복수회 클릭해 주어도 되지 않는다.

정렬을 지우는 버튼을 설치하고 클릭하면 초기화됩니다.

방법


  • View측에 DataGrid에 표시시키고 싶은 ViewModel측 프롭퍼티를 중계하는 CollectionViewSource를 추가한다
  • DataGrid의 DataContext에 1.의 CollectionViewSource를 설정해, 그대로 ItemSource에 Binding
  • 소트를 클리어 하는 버튼을 설치해 클릭 이벤트로 DataGrid의 DataContext를 null로 하고 나서 CollectionViewSource를 재설정한다

  • 샘플 코드



    모델



    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.cs
    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="*"}
                    }
                );
            }
        }
    

    보기



    초기화 버튼 클릭으로 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>
    
    
  • CollectionViewSource 의 SortDerection 에 정의하는 것으로 디폴트의 소트를 세세하게 설정할 수 있습니다.

  • 코드 비하인드



    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을 괴롭히고 어떻게든 하려고 하면 순간에 생각하지 않으면 안 되는 것이 늘어날 것 같은 생각이 듭니다.

    뭔가 다른 좋은 실현 방법이 있으면 코멘트를 주시면 감사하겠습니다.

    좋은 웹페이지 즐겨찾기