提到DataGrid 不管是網頁還是應用程式開發都會頻繁使用。通過它我們可以靈活的在行與列間顯示各種資料。本篇將詳細介紹WPF 4 中DataGrid 的相關功能。
自訂欄
預設情況下,當我們為DataGrid 控制項設定ItemSource 屬性後,DataGrid 會根據資料類型自動產生相應的列,下表列出DataGrid 支援的四種列及其資料類型。
在建立DataGrid 時可以通過AutoGenerateColumns 屬性設定列是否自動產生,從而加入自訂欄。如果DataGrid 中同時包含“自動產生列”與“使用者自訂欄”,則首先建立“使用者自訂欄”。下面代碼執行個體中分別建立這四種列:
<Window x:Class="WPF4ControlTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WPF4ControlTest" xmlns:assembly="clr-namespace:System;assembly=mscorlib" Title="MainWindow" Height="200" Width="500"> <Window.Resources> <ObjectDataProvider x:Key="sexEnum" MethodName="GetValues" ObjectType="{x:Type assembly:Enum}"> <ObjectDataProvider.MethodParameters> <x:Type Type="local:SexOpt"/> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </Window.Resources> <Grid> <DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Name" Width="80" Binding="{Binding Name}"/> <DataGridTextColumn Header="Age" Width="50" Binding="{Binding Age}"/> <DataGridComboBoxColumn Width="80" Header="Sex" SelectedItemBinding="{Binding Sex}" ItemsSource="{Binding Source={StaticResource sexEnum}}"/> <DataGridCheckBoxColumn Header="Pass Exam?" Width="100" Binding="{Binding Pass}"/> <DataGridHyperlinkColumn Header="Email" Width="150" Binding="{Binding Email}"/> </DataGrid.Columns> </DataGrid> </Grid></Window>
其中每列都包含各自的數實值型別,在C# 中建立Member 類及SexOpt 枚舉,並將memberData 資料繫結到DataGrid:
using System;using System.Windows;using System.Collections.ObjectModel;namespace WPF4ControlTest{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); ObservableCollection<Member> memberData = new ObservableCollection<Member>(); memberData.Add(new Member() { Name = "Joe", Age = "23", Sex = SexOpt.Male, Pass = true, Email = new Uri("mailto:Joe@school.com") }); memberData.Add(new Member() { Name = "Mike", Age = "20", Sex = SexOpt.Male, Pass = false, Email = new Uri("mailto:Mike@school.com") }); memberData.Add(new Member() { Name = "Lucy", Age = "25", Sex = SexOpt.Female, Pass = true, Email = new Uri("mailto:Lucy@school.com") }); dataGrid.DataContext = memberData; } } public enum SexOpt { Male, Female }; public class Member { public string Name { get; set; } public string Age { get; set; } public SexOpt Sex { get; set; } public bool Pass { get; set; } public Uri Email { get; set; } }}
這樣我們就可以通過自訂欄的方式建立出DataGrid:
選擇模式
預設情況下,DataGrid 的選擇模式為“全行選擇”,並且可以同時選擇多行(如所示),我們可以通過SelectionMode 和SelectionUnit 屬性來修改DataGrid 的選擇模式。
SelectionUnit:包含Cell、FullRow 和CellOrRowHeader 三種單元選擇模式。
· Cell:選擇儲存格;
· FullRow:選擇全行;
· CellOrRowHeader:可選擇儲存格,也可以通過點擊行首選擇全行;
SelectionMode:分為Extended 和Single 兩種模式。
· Extended:選擇多個單元(儲存格或全行,由SelectionUnit 定義);
· Single:選擇唯一單元(儲存格或全行,由SelectionUnit 定義);
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" SelectionUnit="Cell" SelectionMode="Extended">… …
設定SelectionUnit 和SelectionMode 後的執行個體效果:
編輯
預設情況下,我們可以直接在DataGrid 中編輯資料(下表為相關的編輯命令),當然也可以通過IsReadOnly 屬性將DataGrid 設定為唯讀方式。
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" SelectionUnit="Cell" SelectionMode="Extended" IsReadOnly="True">… …
其他設定
CanUserAddRows、CanUserDeleteRows、CanUserReorderColumns、CanUserResizeColumns、
CanUserResizeRows、CanUserSortColumns 、FrozenColumnCount、DisplayIndex