FilterDataGrid作成(1)ソース:MainWindow

DataGridを継承したFilterDataGridを作成し、DataGridにExcelのようなフィルタ機能を標準で追加した独自コントロールを作成する。
下記のHPに素晴らしいサンプルがあったので、それにちょっと手を加えて最終的には独自コントロールにして、dllを作って参照するところまで行う予定。
参考)http://www.jarloo.com/excel-like-autofilter-in-wpf/

プログラムソースについては、各回でブログに張り付ける。
最後まで説明が終わったらソースを張り付ければコンパイルできる・・・はず。
<ソリューションの構成>



<ブログに張り付けるソース>
  ・MainWindow.xaml
  ・DataGridFilterTextColumnHeader.xaml
  ・CheckedListItem.cs
  ・DataGridFilterTextColumn.xaml
  ・DataGridFilterTextColumnHeader.xaml
  ・FilterDataGrid.cs


ちなみにWPFはMVVMデザインパターンの様式で実装を行うのが通常(らしい)が、Windows フォームの経験しかないので「Prism」や「MVVM Light Toolkit」などのMVVMでの実装を支援するツールキットは利用せずに頑張って作成してみる。
※業務系アプリをWindowsフォームで作った経験しかないので、超個人的な意見です。

最終結果は以下の通りです。
※dllにして独自クラスをバインディングするあたりがちょっと苦戦。

実行例)


利用例)
  MainWindow.xaml

<Window x:Class="FilterDataGridSample.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:local="clr-namespace:FilterDataGridSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>

        <local:FilterDataGrid ItemsSource="{Binding Persons}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <local:DataGridFilterTextColumn  Binding="{Binding Name}" HeaderText="氏名"/>
                <local:DataGridFilterTextColumn  Binding="{Binding Address}" HeaderText="住所"/>
                <local:DataGridFilterTextColumn  Binding="{Binding Sex}" HeaderText="性別"/>
                <local:DataGridFilterTextColumn  Binding="{Binding BirthDay}" HeaderText="生年月日"/>
                <local:DataGridFilterTextColumn  Binding="{Binding Memo}" HeaderText="備考"/>
                <local:DataGridFilterTextColumn  Binding="{Binding Name}" HeaderText="テスト"/>
            </DataGrid.Columns>
        </local:FilterDataGrid>
     
    </Grid>
</Window>

 MainWindow.xaml.cs
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
     
        public class MainViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;

            public class Person
            {
                public string Name { get; set; }
                public string Address { get; set; }
                public string Sex { get; set; }
                public string BirthDay { get; set; }
                public string Memo { get; set; }
            }

            private ObservableCollection<Person> _persons = new ObservableCollection<Person>();
            public ObservableCollection<Person> Persons
            {
                get { return _persons; }
                set
                {
                    _persons = value;
                    if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Persons"));
                }
            }

        }

        public MainViewModel ViewModel = new MainWindow.MainViewModel();
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            ViewModel.Persons.Add(new MainViewModel.Person { Name = "日本 太郎", Address = "日本", Sex = "男", BirthDay = "1980/10/22" });
            ViewModel.Persons.Add(new MainViewModel.Person { Name = "日本 一郎", Address = "日本", Sex = "女", BirthDay = "1980/10/21" });
            ViewModel.Persons.Add(new MainViewModel.Person { Name = "日本 二郎", Address = "日本", Sex = "男", BirthDay = "1980/11/22" });
            ViewModel.Persons.Add(new MainViewModel.Person { Name = "日本 三郎", Address = "北海道", Sex = "女", BirthDay = "1980/12/22" });
            ViewModel.Persons.Add(new MainViewModel.Person { Name = "日本 四郎", Address = "瀬戸内海", Sex = "男", BirthDay = "1980/10/22" });
            this.DataContext = ViewModel;
        }
    }

0 件のコメント:

コメントを投稿

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...