WPF DataGrid未失焦删除新增项时恢复新增模板行方法
WPF DataGrid 未完成编辑删除新增行导致新增模板行消失问题
前言:暂未找到可精准描述该问题的合适标题,若有更优表述欢迎调整。
问题描述
DataGrid控件存在如下异常表现:当DataGrid设置CanUserAddRows属性为True时,控件末尾默认会显示供用户新增条目的空白模板行,但如果用户通过该模板行创建新条目后,在该行从未失去焦点、未完成编辑提交的情况下就删除该条目,控件将不会生成新的新增模板行。
复现实例
界面XAML代码如下:
<Window x:Class="WpfApp1.MainWindow" 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:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid CanUserAddRows="True" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Width="50" Binding="{Binding Name}"/> <DataGridTextColumn Width="50" Binding="{Binding Desc}"/> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Width="30" Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource AncestorType=Window}}" CommandParameter="{Binding}"></Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window>
上述界面基于MVVM模式实现,DataGrid的ItemsSource绑定到Item类型的ObservableCollection集合,设置CanUserAddRows为True显示空白新增行,同时在行内放置删除按钮,点击后执行ViewModel中的删除命令,核心逻辑如下:
public void ExecuteDelete(object obj) { if (obj is Item item) { Items.Remove(item); } }
测试验证结果:
- 对于集合中已存在的持久化条目,删除按钮功能运行正常
- 如果用户点击模板行创建新条目后,未切换焦点使该行退出编辑状态,就直接点击该行的删除按钮,条目删除后不会生成新的新增模板行
- 只有删除前该行已失去焦点、完成编辑提交,删除后才会正常生成新的模板行
现象说明
复现操作按顺序对应如下截图:
- 初始状态下控件存在空白新增模板行

- 点击模板行创建新条目、输入内容后,未取消选中该行就直接触发删除

- 删除后控件无新增模板行

- 若删除前先点击其他行完成编辑,删除对应条目后会正常显示新的模板行,操作无异常

咨询问题
如何避免上述DataGrid新增模板行被永久删除的问题?解决方案需符合MVVM规范。可接受的方案分为两类:
- 禁止用户在完成新行编辑前删除该行
- 通过任意方式让新增模板行重新显示(该方案为优先选项)
经测试,删除前直接切换SelectedItem到其他项的方式无法解决该问题。
内容的提问来源于stack exchange,提问作者Azzarrel
相关产品推荐
相关产品推荐

