WPF数据视图学习
當你綁定集合到ItemsControl,數據視圖被安靜地在幕后創造。視圖位于數據源和綁定控件之間。數據視圖是通往數據源的一個窗口。它跟蹤當前項目,它支持諸如排序,過濾,和分組特征。這些特征獨立于數據對象本身,意味著你能以不同的方式、在窗口的不同部分(或應用的不同部分)綁定相同的數據。例如,你能綁定相同的產品集合到兩個不同的列表但是過濾他們顯示不同的記錄。
視圖對象依賴于數據對象的類型。所有的視圖派生自CollectionView,但是兩個特殊的實現派生自CollectionView:ListCollectionView和BindingListCollectionView。這是它如何工作:
- 如果數據源實現IBindingList,一個BindingListCollectionView被創造。當你綁定一個ADO.NET DataTable時發生。
- 如果數據源沒有實現IBindingList但是它實現IList,一個ListCollectionView被創造。當你綁定一個ObservableCollection,如同產品的列表。
- 如果你的數據源沒有實現IBindingList或IList但是它實現IEnumerable,你獲得一個基本CollectionView。
取回一個視圖對象
為獲得一個目前在使用的視圖對象,你使用System.Windows.Data.CollectionViewSource類的GetDefaultView()靜態方法。當你調用GetDefaultView(),并傳遞數據源,就是你正使用的集合。這是一個例子,獲得綁定到列表的產品集合的視圖:
ListCollectionView lcv = CollectionViewSource.GetDefaultView(list) as ListCollectionView;有了視圖對象,就可以導航、排序、過濾和分組了。
視圖導航
視圖對象決定列表項目的數目(Count屬性)和獲得當前的數據對象一個引用(CurrentItem)或當前的位置索引(CurrentPosition)。也能使用幾個方法從一記錄移動到另一個,諸如MoveCurrentToFirst(),MoveCurrentToLast(),MoveCurrentToNext(),MoveCurrentToPrevious(),和MoveCurrentToPosition()。
private void Button_Click_2(object sender, RoutedEventArgs e){lcv.MoveCurrentToNext();lv.ScrollIntoView(lv.SelectedItem);} <ListView Height="200" Name="lv" IsSynchronizedWithCurrentItem="True" >要注意對ListView一定要加IsSynchronizedWithCurrentItem="True"這句,在對視圖對象操作時同步發生,否則操作視頻不起作用。
排序
?
<StackPanel Orientation="Horizontal"><RadioButton Content="姓名" Click="RadioButton_Click"></RadioButton><RadioButton Content="年齡" Click="RadioButton_Click_1"></RadioButton></StackPanel>注意在排序前先清空以前的排序,否則排序不起作用。
private void RadioButton_Click(object sender, RoutedEventArgs e){lcv.SortDescriptions.Clear();lcv.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));}過濾
過濾允許你顯示滿足特定條件的一個子集。當帶有一個集合作為數據源工作時,你使用視圖對象的Filter屬性設置過濾。
Filter屬性的實現有點笨拙。它接受一個Predicate委托指向一個自定義過濾方法
?
private void Button_Click_5(object sender, RoutedEventArgs e){if (key.Text.Trim() == "")lcv.Filter = null;lcv.Filter = item =>{var p = item as Person;if (p.Name.Contains(key.Text)){return true;}elsereturn false;};}?
分組
當你使用分組,你的列表為每個分組創造一個獨立的GroupItem對象,并且它添加這些GroupItem對象到列表。GroupItem是一個內容控件,所以每個GroupItem持有合適的容器(好像ListBoxItem對象),容器帶有你的實際的數據。顯示你的分組的關鍵是格式化GroupItem元素所以它脫穎而出。
分組是比較麻煩,但一定要掌握,下面以一個實例完成分組功能
1、首先綁定數據 ,獲取視圖ListCollectionView lcv,接下來實現分組依據-創建值轉換器分組類,比如姓名長度分組,還有按年齡大小分組:
public class SizeGroup : IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){int p = (int)value;if (p > 50)return "老年組";elsereturn "青年組";}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}}public class LengthGroup : IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){var p = value.ToString();if (p.Length > 6){return "三個字的";}elsereturn "二個字的";}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}}2、添加分組樣式ListView.GroupStyle,這里就確定了分組標題具體樣式,添加HeaderTemplate模板,如下 ,其binging Name 和ItemCount是CollectionViewGroup對象提供的屬性。
<ListView Height="200" Name="lv" IsSynchronizedWithCurrentItem="True" ><ListView.View><GridView><GridView.Columns><GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}"></GridViewColumn><GridViewColumn Header="年齡" DisplayMemberBinding="{Binding Age}"></GridViewColumn></GridView.Columns></GridView></ListView.View><ListView.GroupStyle><GroupStyle><GroupStyle.HeaderTemplate><DataTemplate><Border BorderThickness="3" BorderBrush="Green"><StackPanel><TextBlock Text="{Binding Name}"></TextBlock><TextBlock><Run>(共有</Run><Run Text="{Binding ItemCount}"></Run><Run>個文件)</Run></TextBlock></StackPanel></Border></DataTemplate></GroupStyle.HeaderTemplate></GroupStyle></ListView.GroupStyle></ListView>3、對分組按鈕添加事件:
<StackPanel Orientation="Horizontal"><RadioButton Content="按年齡大小分組" Click="RadioButton_Click_2"></RadioButton><RadioButton Content="按姓名長度分組" Click="RadioButton_Click_3"></RadioButton></StackPanel> private void RadioButton_Click_2(object sender, RoutedEventArgs e){lcv.GroupDescriptions.Clear();lcv.GroupDescriptions.Add(new PropertyGroupDescription("Age", new SizeGroup()));}private void RadioButton_Click_3(object sender, RoutedEventArgs e){lcv.GroupDescriptions.Clear();lcv.GroupDescriptions.Add(new PropertyGroupDescription("Name", new LengthGroup()));}事件中對視圖添加相應的分組條件并傳入值轉換器。實現完畢
?
轉載于:https://www.cnblogs.com/lunawzh/p/5986341.html
總結
- 上一篇: spring源码 — 一、IoC容器初始
- 下一篇: Hibernate抓取策略