WPF中如何实现DataGrid显示空行网格线且支持末尾新增行?
WPF DataGrid 效果实现方案
期望效果

要实现两个核心需求:
- 无绑定数据时也显示完整的行网格线,不会出现空白区域
- 填充数据后,底部自带可直接录入的新增行,支持用户快速添加数据
实现步骤
1. 开启底部新增行功能
WPF DataGrid 自带该能力,无需额外自定义控件:
- XAML中给DataGrid添加属性
CanUserAddRows="True" - 绑定的数据源需为
ObservableCollection<T>类型,且泛型T对应的实体类要有公共无参构造函数,保证新增行逻辑正常生效
2. 无数据时显示空网格线
通过添加空白占位行的方式实现,逻辑简单且兼容性好:
XAML 示例代码
<DataGrid x:Name="MyDataGrid" CanUserAddRows="True" AutoGenerateColumns="False" RowHeight="25" ItemsSource="{Binding DataList}" Loaded="MyDataGrid_Loaded" BeginningEdit="MyDataGrid_BeginningEdit"> <DataGrid.Columns> <!-- 按需配置你的业务列 --> <DataGridTextColumn Header="序号" Binding="{Binding Id}" /> <DataGridTextColumn Header="名称" Binding="{Binding Name}" /> <DataGridTextColumn Header="数值" Binding="{Binding Value}" /> </DataGrid.Columns> </DataGrid>
后台逻辑代码(C#)
首先定义业务实体类:
public class BizItem { public int Id { get; set; } public string Name { get; set; } public double Value { get; set; } // 标识是否为占位空行 public bool IsPlaceholder { get; set; } = false; // 必须有公共无参构造函数 public BizItem() { } }
页面逻辑代码:
// 绑定的数据源 public ObservableCollection<BizItem> DataList { get; set; } = new ObservableCollection<BizItem>(); private void MyDataGrid_Loaded(object sender, RoutedEventArgs e) { // 初始化填充空行 FillPlaceholderRows(); // 监听数据源变化,动态调整占位行数量 DataList.CollectionChanged += (s, args) => FillPlaceholderRows(); } // 填充占位空行方法 private void FillPlaceholderRows() { // 计算当前DataGrid可视区域可容纳的总行数(减去表头和自带新增行的高度) int availableRowCount = (int)Math.Floor((MyDataGrid.ActualHeight - MyDataGrid.ColumnHeaderHeight - 25) / MyDataGrid.RowHeight); // 现有有效业务数据行数(排除占位行) int validRowCount = DataList.Count(x => !x.IsPlaceholder); // 需要补充的占位行数量 int needPlaceholderCount = availableRowCount - validRowCount; // 先移除所有旧的占位行 foreach (var placeholder in DataList.Where(x => x.IsPlaceholder).ToList()) { DataList.Remove(placeholder); } // 补充对应数量的新占位行 for (int i = 0; i < needPlaceholderCount; i++) { DataList.Add(new BizItem { IsPlaceholder = true }); } } // 处理编辑事件,将占位行转为有效业务行 private void MyDataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) { if (e.Row.Item is BizItem item && item.IsPlaceholder) { item.IsPlaceholder = false; // 编辑占位行后补充新的占位行,保证网格始终填满 FillPlaceholderRows(); } }
注意事项
- 若DataGrid高度随窗口自适应,可监听窗口大小变化事件,触发
FillPlaceholderRows方法重新计算占位行数量 - 提交数据时只需过滤掉
IsPlaceholder = true的占位行即可,不会影响业务数据提交
内容的提问来源于stack exchange,提问作者Fazal Qayyum
相关产品推荐
相关产品推荐

