WPF使用BindingListCollectionView 和 ListCollectionView 视图排序集合

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

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

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

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

 

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

 

ListCollectionView例子

 

public partial class MainWindow : Window
    {
        MyViewModel myViewModel = new MyViewModel();
        public MainWindow()
        {
            InitializeComponent();
            //
            myViewModel.DataList = new System.Collections.ObjectModel.ObservableCollection<MyData>();
            myViewModel.SourceViewList = new ListCollectionView(myViewModel.DataList);

            this.DataContext = myViewModel;
            //
            for (int i = 0; i < 100; i++)
            {
                MyData item = new MyData();
                item.Name = "Name:" + i.ToString();
                myViewModel.DataList.Add(item);
            }
        }

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            myViewModel.FilterText = txt1.Text;
            myViewModel.SourceViewList.Filter = new Predicate<object>(PredicateFilter);
        }

        private bool PredicateFilter(object obj)
        { 
            MyData data = obj as MyData;
            if (data.Name.Contains(myViewModel.FilterText))
                return true;

            return false;
        }
    }

    public class MyViewModel
    {
        public string FilterText
        {
            get;
            set;
        }

        public System.ComponentModel.ICollectionView SourceViewList
        {
            get;
            set;
        }

        public System.Collections.ObjectModel.ObservableCollection<MyData> DataList
        {
            get;
            set;
        }
    }

    public class MyData
    {
        public string Name
        {
            get;
            set;
        }
    }
View Code

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值