当将一个集合或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; } }