什麼是集合視圖?
集合視圖是位於綁定源集合頂部的一層,您可以通過它使用排序、篩選和分組查詢來導航和顯示源集合,而無需更改基礎源集合本身。集合視圖還維護著一個指向集合中的當前項的指針。如果源集合實現了 INotifyCollectionChanged 接口,則CollectionChanged 事件引發的更改將傳播到視圖。
如果將控件直接綁定到集合,則 WPF 會綁定到其默認視圖。此默認視圖由直接到同一集合的所有綁定共享,因此一個綁定控件或代碼對默認視圖所做的更改(如排序或對當前項指針的更改)會反映在到同一集合的所有其它綁定中。
演示共享集合視圖
有時使用ItemsControl控件顯示對象集合,當選中其中一項時,顯示其詳細信息,如下圖所示:
<Button Content="{Binding }" /> <Button Content="{Binding Path=/}" /> <Button Content="{Binding Path=/Description}" />
下面的代碼定義了ContentControl綁定數據的顯示模板
<DataTemplate x:Key="DetailTemplate"> <Border Width="300" Height="100" Margin="20" BorderBrush="Aqua" BorderThickness="1" Padding="8"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Text="First Name:"/> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=FirstName}"/> <TextBlock Grid.Row="1" Grid.Column="0" Text="Last Name:"/> <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=/LastName}"/> <TextBlock Grid.Row="2" Grid.Column="0" Text="Home Town:"/> <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=/HomeTown}"/> </Grid> </Border> </DataTemplate>
下面的代碼演示綁定到集合
<ListBox Width="200" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource MyFriends}}"/> <ContentControl Content="{Binding Source={StaticResource MyFriends}}" ContentTemplate="{StaticResource DetailTemplate}"/>
演示如何創建集合視圖
如果不想共享一個視圖,可以創建一個新視圖,下面代碼演示創建了一個集合視圖的靜態資源:
<Window.Resources> <CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}" x:Key="listingDataView" /> </Window.Resources>
CollectionViewSource 是 CollectionView 類或從 CollectionView 派生的類的代理。CollectionViewSource 使 XAML 代碼能夠設置常用的 CollectionView 屬性,從而將這些設置傳遞到基礎視圖。CollectionViewSource 具有一個保存實際視圖的 View 和一個保存源集合的 Source 屬性。
然後可以將控件綁定到該視圖:
<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8" ItemsSource="{Binding Source={StaticResource listingDataView}}"> </ListBox>
CollectionViewSource 是代理類,其中保存的實際視圖參考以下類型:
源集合類型 集合視圖類型 說明 IEnumerable 基於CollectionView的內部類型 無法對項進行分組 IList ListCollectionView 最快 IBindingList BindingListCollectionView在代碼中獲取集合視圖的方式是:
(ListCollectionView) view=(ListCollectionView)CollectionViewSource.GetDefaultView(rootElement.DataContext);