WPF 过滤( ListCollectionView 与BindingListCollectionView)

目录

ListCollectionView过滤 

定义过滤器 

使用方法

BindingListCollectionView过滤

BindingListCollectionView排序


 


        当将一个集合或DataTable绑定到ItemsControl控件时,在后对台会自动地创建数据视图,这个视图位于数据源和绑定的控件之间,数据视图是进行数据源的窗口。它跟踪当前项,并且提供各种功能,如排序、过滤以及分组。这些功能和数据对象本身是相互独立的,这意味着可以在窗口的不同部分使用不同的方式绑定相同的数据。使用的视图依附于数据对象,所有的视图都继承自CollectionView类,并且有两个继承自CollectionView类的特殊实现(ListCollectionView类和BindingListCollectionView),下面是CollectionView类的工作源理。

  1.如果数据源实现了IBindingList接口(这里指的是DataTable对象),此时就会创建一个BindingListCollectionView视图。

  2.如果数据源实现了INotifyCollectionChanged接口(这里指的是ObservableCollection对象),此时就会创建一个ListCollectionView视图。

  3.如果数据源没有实现IBindingList接口和INotifyCollectionChanged接口,但是实现了IEnumerable接口,就会得到一个基本的CollectionView视图。

 

ListCollectionView过滤 

        数据源为集合

定义过滤器 

 public class RaceByPreDayFilter
    {
        /// 
        /// 开始字符。如20190617, 如期号为20190617007,这里取前8位
        /// 
        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 races = (ObservableCollection)this.RaceGrid.ItemsSource;

            //创建视图的引用
            view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.RaceGrid.ItemsSource);

            RaceByPreDayFilter raceByPreDayFilter;
            if (view != null)
            {
                raceByPreDayFilter = new RaceByPreDayFilter(preDateWord);
                view.Filter = new Predicate(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对象和基础数据源是DataTableDataView

 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 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();

 

你可能感兴趣的:(.Net应用技术)