目录
当将一个集合或DataTable绑定到ItemsControl控件时,在后对台会自动地创建数据视图,这个视图位于数据源和绑定的控件之间,数据视图是进行数据源的窗口。它跟踪当前项,并且提供各种功能,如排序、过滤以及分组。这些功能和数据对象本身是相互独立的,这意味着可以在窗口的不同部分使用不同的方式绑定相同的数据。使用的视图依附于数据对象,所有的视图都继承自CollectionView类,并且有两个继承自CollectionView类的特殊实现(ListCollectionView类和BindingListCollectionView),下面是CollectionView类的工作源理。
1.如果数据源实现了IBindingList接口(这里指的是DataTable对象),此时就会创建一个BindingListCollectionView视图。
2.如果数据源实现了INotifyCollectionChanged接口(这里指的是ObservableCollection对象),此时就会创建一个ListCollectionView视图。
3.如果数据源没有实现IBindingList接口和INotifyCollectionChanged接口,但是实现了IEnumerable接口,就会得到一个基本的CollectionView视图。
ListCollectionView过滤
数据源为集合
定义过滤器
public class RaceByPreDayFilter
{
/// <summary>
/// 开始字符。如20190617, 如期号为20190617007,这里取前8位
/// </summary>
public string StartCharacter { get; set; }
public RaceByPreDayFilter(string filterWord)
{
StartCharacter = filterWord;
}
public bool FilterItem( object item)
{
Race race= item as Race;
if (race!=null)
{
if (race.QH.ToString().Substring(0,8)!= StartCharacter)
{
return true;
}
}
return false;
}
}
使用方法
ListCollectionView view;
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
DateTime dt = this.myFirstDate.SelectedDate.Value;
string preDateWord = dt.AddDays(-1).ToString("yyyyMMdd");
ObservableCollection<Race> races = (ObservableCollection<Race>)this.RaceGrid.ItemsSource;
//创建视图的引用
view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.RaceGrid.ItemsSource);
RaceByPreDayFilter raceByPreDayFilter;
if (view != null)
{
raceByPreDayFilter = new RaceByPreDayFilter(preDateWord);
view.Filter = new Predicate<object>(raceByPreDayFilter.FilterItem);
}
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
//创建视图的引用
view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.RaceGrid.ItemsSource);
if (view!=null)
{
view.Filter = null;
}
}
BindingListCollectionView过滤
BindingListCollectionView对象和基础数据源是DataTable
或DataView
public partial class MainWindow : Window
{
//过滤器 Step1
private BindingListCollectionView view;
public MainWindow()
{
InitializeComponent();
var vm = new MainWindowViewModel();
this.DataContext = vm;
var a = vm.Stulist;
view = (BindingListCollectionView)CollectionViewSource.GetDefaultView(vm.Stulist);
}
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
Grade grade = (Grade)gradeTree.SelectedValue;
string filterWord = grade.GradeName;
if (view != null)
{
view.CustomFilter = $"班级='{filterWord}'"; //设置CustomFilter
view.Refresh();
}
}
}
BindingListCollectionView排序
BindingListCollectionView myBindingListCollectionView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(mylistbox.ItemsSource);
myBindingListCollectionView.SortDescriptions.Add(new SortDescription("names", ListSortDirection.Descending));
myBindingListCollectionView.SortDescriptions.Add(new SortDescription("id", ListSortDirection.Ascending));
BindingListCollectionView myBindingListCollectionView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(mylistbox.ItemsSource);
myBindingListCollectionView.SortDescriptions.Clear();