若是想以特定的方式對數據進行排序,能夠綁定到 CollectionViewSource,而不是直接綁定到 ObjectDataProvider。CollectionViewSource 則會成爲數據源,並充當截取 ObjectDataProvider 中的數據的媒介,並提供排序、分組和篩選功能,而後將它傳送到目標。
這個顯示是使用 CollectionViewSource作爲排序的數據源,首先將CollectionViewSource的Source 屬性設置爲 ObjectDataProvider的資源名稱。而後經過設置CollectionViewSource.SortDescriptions屬性,指定排序字段和排序順序:express
<CollectionViewSource x:Key="studentsView" Source="{Binding Source={StaticResource students}}"> <CollectionViewSource.SortDescriptions> <scm:SortDescription PropertyName="Name" Direction="Ascending" /> <scm:SortDescription PropertyName="Age" Direction="Descending" /> </CollectionViewSource.SortDescriptions> </CollectionViewSource>
WPF中的DataContext屬性是很是有用的,若是你有多個控件須要綁定同一個數據源,那麼按照WinForm中的作法是給每一個控件都綁定一次數據源,那麼作重複代碼就會不少。而在WPF中你能夠首先把這些須要綁定同一個數據源的控件放在同一個容器控件內,而後將容器控件的 DataContext 設置爲綁定源,容器內的控件的數據源綁定就能夠沒必要再綁定,使用容器的數據源。例如,下面
的示例:StackPanel的 DataContext 屬性綁定了數據源,DataGrid就能夠沒必要再次綁定了,直接使用StackPanel綁定的數據源markdown
<StackPanel DataContext="{StaticResource studentsView}"> <TextBlock Width="248" Height="24" Text="數據排序:" TextWrapping="Wrap"/> <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" CanUserAddRows="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Name}" Header="名稱" /> <DataGridTextColumn Binding="{Binding Age}" Header="年齡" /> <DataGridTextColumn Binding="{Binding Country}" Header="國家" /> <DataGridTextColumn Binding="{Binding Birthday}" Header="出生日期" /> </DataGrid.Columns> </DataGrid> </StackPanel>
若是該容器沒有定義 DataContext,那麼它會繼續查找下一個外部嵌套容器,直到它找到當前的 DataContext 爲止。以下圖所示。當點擊列頭時,數據就會進行順序或逆序排序。以下圖。 app
<Window x:Class="WpfApp4.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" xmlns:local="clr-namespace:WpfApp4" mc:Ignorable="d" Title="Window1" Height="700" Width="500"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="140"/> <RowDefinition Height="150"/> <RowDefinition Height="140"/> <RowDefinition Height="100*"/> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <TextBlock Width="248" Height="24" Text="股票名稱:" TextWrapping="Wrap"/> <ListBox x:Name="listStockName" Width="248" Height="56"> <ListBoxItem Content="全通教育"/> <ListBoxItem Content="大智慧"/> <ListBoxItem Content="寶鋼股份"/> <ListBoxItem Content="浦發銀行"/> <ListBoxItem Content="工商銀行"/> <ListBoxItem Content="中國建築"/> <ListBoxItem Content="中國南車"/> </ListBox> <TextBlock Width="248" Height="24" Text="你所選中的股票名稱:" /> <TextBlock Width="248" Height="24" Text="{Binding ElementName=listStockName, Path=SelectedItem.Content}"> </TextBlock> </StackPanel> <StackPanel Grid.Row="1"> <TextBlock Width="248" Height="24" Text="顏色:" TextWrapping="Wrap"/> <ListBox x:Name="listColor" Width="248" Height="56"> <ListBoxItem Content="Blue"/> <ListBoxItem Content="Red"/> <ListBoxItem Content="Green"/> <ListBoxItem Content="Gray"/> <ListBoxItem Content="Cyan"/> <ListBoxItem Content="GreenYellow"/> <ListBoxItem Content="Orange"/> </ListBox> <TextBlock Width="248" Height="24" Text="改變背景色:" /> <TextBlock Width="248" Height="24" Text="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}" Background="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}"> </TextBlock> <TextBox Name="txtTwoWay" Text="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}" Background="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}"></TextBox> </StackPanel> <StackPanel Grid.Row="2"> <StackPanel.Resources> <XmlDataProvider x:Key="MyColors" Source="Colors.xml" XPath="colors"> </XmlDataProvider> </StackPanel.Resources> <TextBlock Width="248" Height="24" Text="XML數據綁定:" TextWrapping="Wrap"/> <ListBox x:Name="listXmlColor" Width="248" Height="56" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource MyColors},XPath=color/@name}"> </ListBox> <TextBlock Width=