DataGridTextColumn无法输入文本但可粘贴,原因何在?
我之前做WPF项目时碰到过一模一样的问题——手动敲键盘输入没反应,但粘贴文本完全正常,折腾了好一阵才找到根源,大概率是下面这几个情况,你可以挨个排查:
绑定的属性setter有问题
先检查你的实体类里Description和SortOrder这两个属性,是不是只有getter没写setter?或者setter里没正确给私有字段赋值?虽然粘贴能生效,可能是某些场景下绕过了常规的属性设置逻辑,但手动输入必须依赖setter来更新数据源。举个正确的实现例子:private string _description; public string Description { get => _description; set { if (_description != value) { _description = value; OnPropertyChanged(nameof(Description)); // 实现INotifyPropertyChanged的话别忘了触发通知 } } }键盘输入被事件拦截了
看看你后台代码里的dataGrid_InitializingNewItem或者其他和DataGrid相关的事件(比如PreviewKeyDown、KeyDown),有没有写e.Handled = true这种代码?如果有的话,手动输入的按键事件会被直接吃掉,根本传不到单元格里的TextBox。但粘贴操作(比如右键菜单粘贴、Ctrl+V)可能不会被这个事件拦截,所以能正常工作。单元格没进入真正的编辑模式
有时候点击单元格只是选中了行,并没有触发编辑状态,这时候敲键盘当然没反应。你可以试试双击单元格或者按F2进入编辑模式后再输入,如果能正常输入,那就是触发编辑的方式问题。可以调整DataGrid.SelectionUnit为Cell,或者在MouseLeftButtonUp事件里手动触发单元格编辑:private void dataGrid_CellMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { var cell = sender as DataGridCell; if (cell != null && !cell.IsEditing) { dataGrid.BeginEdit(e); } }绑定的ValidationRule拦截了输入
如果你给绑定添加了自定义的ValidationRule,刚好手动输入的内容不符合规则(比如输入了非数字字符到SortOrder列),但粘贴的内容是合法的,那手动输入就会被拦截。这种情况下单元格一般会显示红色的错误边框,你可以留意一下这个细节。IsReadOnly设置有冲突
虽然你XAML里没显式设置,但有可能后台代码把DataGrid.IsReadOnly设成了true,或者在CellStyle里给TextBox偷偷加了IsReadOnly="True"?不过这种情况粘贴通常也会失效,除非是代码逻辑里的特殊处理,还是可以检查一下。
内容的提问来源于stack exchange,提问作者Woife M.

