下記の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 件のコメント:
コメントを投稿