2018/11/02(Fri) 15:17:44 編集(投稿者)
■No89155 (Hongliang さん) に返信
> CollectionViewSourceを使ってコードビハインドでフィルタするのがいいでしょう。
ありがとうございます。
CollectionViewSource については初めてだったので調べてみました。
http://increment.hatenablog.com/entry/2015/10/19/205222
を参考に、Behavior にして確認してみました。
問題なくフィルタをかけることができました。
ありがとうございました。
確認した Behavior 大まかに記載しておきます。
class StaffInfoBehavior : Behavior<UserControl>
{
private CollectionViewSource _collectionViewSource;
private UserControl _control;
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.Loaded += OnLoaded;
this.AssociatedObject.Unloaded += OnUnloaded;
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.Loaded -= OnLoaded;
this.AssociatedObject.Unloaded -= OnUnloaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
_control = sender as UserControl;
if (_control != null)
{
var vm = _control.DataContext as ViewModels.MainViewModel;
if (vm != null)
{
// CollectionViewSource を設定する
_collectionViewSource = new CollectionViewSource();
_collectionViewSource.Filter += Staff_Filter;
_collectionViewSource.Source = vm.StaffInfos;
var datagrid = _control.FindName("staffList") as DataGrid;
datagrid.ItemsSource = _collectionViewSource.View;
// CheckBox にイベントを追加する
var 男性Check = _control.FindName("男性Check") as CheckBox;
男性Check.Checked += OnCheckedChanged;
男性Check.Unchecked += OnCheckedChanged;
var 女性Check = _control.FindName("女性Check") as CheckBox;
女性Check.Checked += OnCheckedChanged;
女性Check.Unchecked += OnCheckedChanged;
}
}
}
private void OnUnloaded(object sender, RoutedEventArgs e)
{
// CheckBox のイベントを削除する
var 男性Check = _control.FindName("男性Check") as CheckBox;
男性Check.Checked -= OnCheckedChanged;
男性Check.Unchecked -= OnCheckedChanged;
var 女性Check = _control.FindName("女性Check") as CheckBox;
女性Check.Checked -= OnCheckedChanged;
女性Check.Unchecked -= OnCheckedChanged;
}
// 表示をフィルタする
private void Staff_Filter(object sender, FilterEventArgs e)
{
if (e.Item != null)
{
var item = e.Item as StaffInfo;
if(item != null)
{
if (item.Gender == "M")
{
var check = _control?.FindName("男性Check") as CheckBox;
e.Accepted = check.IsChecked.Value;
}
else if (item.Gender == "F")
{
var check = _control?.FindName("女性Check") as CheckBox;
e.Accepted = check.IsChecked.Value;
}
}
}
}
// フィルタを更新する
private void OnCheckedChanged(object sender, RoutedEventArgs e)
{
_collectionViewSource?.View.Refresh();
}
}