DataGrid 的 RowDetailsTemplate 功能讓每行數據可展開顯示詳細資訊,完美支援「主從關係」呈現(如:訂單行展開明細、學生行展開科目成績)。本文示範如何定義模板、綁定嵌套數據、實現流暢的展開/摺疊體驗。
public class Member {
public string Name { get; set; }
public string Age { get; set; }
public SexOpt Sex { get; set; }
public bool Pass { get; set; }
public DateTime ExamDate { get; set; }
public Uri Email { get; set; }
// 新增:科目成績(作為 RowDetails 顯示)
public int Math { get; set; }
public int History { get; set; }
}
var memberData = new ObservableCollection<Member>();
memberData.Add(new Member {
Name = "Lucy", Age = "25", Sex = SexOpt.Female, Pass = true,
ExamDate = new DateTime(2010, 4, 10),
Email = new Uri("mailto:Lucy@school.com"),
Math = 80, History = 85
});
// ... 更多資料
dataGrid.DataContext = memberData;
<Window.Resources>
<DataTemplate x:Key="RowDetailsTemplate">
<Border BorderThickness="0" Background="Orchid" Padding="10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Math: " VerticalAlignment="Center"/>
<TextBlock Text="{Binding Math}" VerticalAlignment="Center"
FontSize="15" FontWeight="Bold"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="History: " VerticalAlignment="Center"/>
<TextBlock Text="{Binding History}" VerticalAlignment="Center"
FontSize="15" FontWeight="Bold"/>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
</Window.Resources>
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False"
RowDetailsTemplate="{StaticResource RowDetailsTemplate}">
<!-- Columns 定義 -->
</DataGrid>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border BorderThickness="0" Background="Orchid" Padding="10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Math: " VerticalAlignment="Center"/>
<TextBlock Text="{Binding Math}" VerticalAlignment="Center"
FontSize="15" FontWeight="Bold"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="History: " VerticalAlignment="Center"/>
<TextBlock Text="{Binding History}" VerticalAlignment="Center"
FontSize="15" FontWeight="Bold"/>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
| 屬性 | 類型 | 說明 | 預設值 |
|---|---|---|---|
RowDetailsTemplate | DataTemplate | 明細行內容模板 | null |
RowDetailsVisibilityMode | VisibilityMode | 顯示模式:Visible/Collapsed/VisibleWhenSelected | VisibleWhenSelected |
AreRowDetailsFrozen | bool | 凍結明細列(水平滾動時不移動) | False |
RowDetailsTemplateSelector | DataTemplateSelector | 根據資料動態選擇模板 | null |
VisibleWhenSelected:選中行時顯示(預設,最常用)Visible:永遠顯示所有行明細Collapsed:永遠隱藏(程式碼控制)public class ScoreDetailTemplateSelector : DataTemplateSelector {
public DataTemplate HighScoreTemplate { get; set; }
public DataTemplate LowScoreTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) {
var member = item as Member;
return (member != null && member.Math > 90) ? HighScoreTemplate : LowScoreTemplate;
}
}
<Window.Resources>
<local:ScoreDetailTemplateSelector x:Key="templateSelector"
HighScoreTemplate="{StaticResource HighScoreTemplate}"
LowScoreTemplate="{StaticResource LowScoreTemplate}"/>
</Window.Resources>
<DataGrid RowDetailsTemplateSelector="{StaticResource templateSelector}" />
點擊行首(或選中行),明細區域平滑展開顯示數學、歷史成績。

https://cid-c75f4e27adfe5bbc.office.live.com/self.aspx/GnieTech/WPF4DataGridControl.zip
RowDetailsTemplate 是 DataGrid 實現「主從明細」的核心功能,配合 `RowDetailsVisibilityMode` 控制展開邏輯,`TemplateSelector` 支援動態模板選擇。將從屬資料內嵌於行展開區域,避免跳轉頁面,保持上下文連續,是桌面端數據密集型應用的優選交互模式。