数据模板是WPF中用来定义如何显示数据对象的一种机制。通过 DataTemplate
标签定义,指定每个数据项在界面中的呈现方式(如布局、颜色、文本)。
代码详解(MainWindow.xaml.cs)
// 第38-43行:定义Color类
public class Color // 创建一个叫Color的类
{
public string Code { get; set; } // 属性1:存储颜色代码(如#FF0000代表红色)
public string Name { get; set; } // 属性2:存储颜色名称(如"红色")
}
// 第23-35行:在MainWindow构造函数中
public MainWindow() // 窗口初始化函数
{
InitializeComponent(); // 初始化界面组件
// 第27行:创建一个Color对象的列表
List<Color> test = new List<Color>();
// 第29-32行:往列表中添加4个颜色数据
test.Add(new Color() { Code = "#FFB6C1", Name = "浅粉红" });
test.Add(new Color() { Code = "#FFC0CB", Name = "粉红" });
test.Add(new Color() { Code = "#DC143C", Name = "深红(猩红)" });
test.Add(new Color() { Code = "#FFF0F5", Name = "淡紫红" });
// 第34行:把数据绑定到界面上的list控件
list.ItemsSource = test; // list是XAML中DataGrid的名字
}
这段代码的作用:创建了4个颜色对象,每个对象包含颜色代码和中文名称,然后把这些数据交给界面显示。
XAML 代码详解(MainWindow.xaml)
<!-- 整个表格容器 -->
<Grid>
<!-- DataGrid:数据表格控件 -->
<DataGrid
x:Name="grid" <!-- 控件名称 -->
AutoGenerateColumns="False" <!-- 不自动生成列 -->
CanUserAddRows="False"> <!-- 用户不能添加行 -->
<!-- 定义表格的列 -->
<DataGrid.Columns>
<!-- 第1列:显示Code属性 -->
<DataGridTextColumn
Binding="{Binding Code}" <!-- 绑定到Color对象的Code属性 -->
Header="Code" /> <!-- 列标题显示"Code" -->
<!-- 第2列:显示Name属性 -->
<DataGridTextColumn
Binding="{Binding Name}" <!-- 绑定到Color对象的Name属性 -->
Header="Name" /> <!-- 列标题显示"Name" -->
<!-- 第3列:自定义模板列 -->
<DataGridTemplateColumn Header="操作">
<DataGridTemplateColumn.CellTemplate>
<!-- 这里开始定义数据模板 -->
<DataTemplate>
<!-- 水平排列的容器 -->
<StackPanel Orientation="Horizontal">
<!-- 颜色方块 -->
<Border
Width="10" <!-- 宽度10像素 -->
Height="10" <!-- 高度10像素 -->
Background="{Binding Code}" /><!-- 背景色绑定到Code属性 -->
<!-- 颜色名称文本 -->
<TextBlock
Margin="10,0" <!-- 左右边距10像素 -->
Text="{Binding Name}" /> <!-- 文本绑定到Name属性 -->
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
数据绑定机制详解
1. 数据流向
C#数据 → XAML界面
Color对象 → DataGrid行
2. 绑定过程(以第一行数据为例)
// C#中的数据对象
Color对象 { Code = "#FFB6C1", Name = "浅粉红" }
<!-- XAML中的绑定结果 -->
第1列: {Binding Code} → 显示 "#FFB6C1"
第2列: {Binding Name} → 显示 "浅粉红"
第3列:
Border的Background="{Binding Code}" → 背景变成浅粉红色
TextBlock的Text="{Binding Name}" → 显示 "浅粉红"
运行结果
DataTemplate只能有一个根元素
规则说明
DataTemplate 必须有且只能有一个根元素,这是XAML的基本规则。
- ✅ 正确:一个根元素
<DataTemplate>
<Button Content="单个按钮" />
</DataTemplate>
- ❌ 错误:多个根元素
<DataTemplate>
<Button Content="按钮1" />
<Button Content="按钮2" /> <!-- 这是第二个根元素,不允许! -->
</DataTemplate>
为什么会有这个限制?
1. XML语法规则
XAML基于XML,XML要求:
- 每个文档必须有唯一的根元素
- 同级不能有多个根元素
2. WPF渲染机制
WPF需要知道:
- "这个模板的内容是什么?"
- 如果有多个根元素,WPF不知道如何处理它们的布局关系
解决方案:使用容器控件
当你需要多个控件时,必须用容器包裹:
方案1:StackPanel(垂直排列)
<DataTemplate>
<StackPanel> <!-- 容器作为根元素 -->
<Button Content="删除" />
<Button Content="复制" />
<Button Content="保存" />
</StackPanel>
</DataTemplate>
方案2:StackPanel(水平排列)
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="删除" />
<Button Content="复制" />
<Button Content="保存" />
</StackPanel>
</DataTemplate>
方案3:Grid(网格布局)
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="删除" />
<Button Grid.Column="1" Content="复制" />
<Button Grid.Column="2" Content="保存" />
</Grid>
</DataTemplate>