DataGridTemplateColumn的CellEditingTemplate中控件无法更新数据源
WPF DataGrid模板列切换显示/编辑状态的绑定问题解决
场景说明
使用MVVM模式实现对话框,DataGrid绑定数据对象的ObservableCollection。数据对象包含DisplayedBarcode(自动读取的条码)、InputBarcode(手动输入的条码)两个字符串属性,需要根据布尔属性IsBarcodeEditable在同一列切换显示/编辑状态。
数据模型代码
public class DataObject : ViewModelBase { #region Fields private string _barcode; private string _inputBarcode; #endregion #region Properties /// <summary> /// 标记条码字段是否可编辑 /// </summary> public bool IsBarcodeEditable { get; set; } /// <summary> /// 用户手动输入的条码字符串 /// </summary> public string InputBarcode { get { return _inputBarcode; } set { if (_inputBarcode == value) { return; } _inputBarcode = value; OnPropertyChanged(nameof(InputBarcode)); } } /// <summary> /// 自动读取的条码字符串 /// </summary> public string DisplayedBarcode { get { return _barcode; } set { if (_barcode == value) { return; } _barcode = value; OnPropertyChanged(nameof(DisplayedBarcode)); } } #endregion }
遇到的问题
采用DataGridTemplateColumn的CellTemplate显示DisplayedBarcode,CellEditingTemplate绑定InputBarcode实现编辑,但当IsBarcodeEditable为true时,输入内容无法触发InputBarcode的setter方法。尝试设置UpdateSourceTrigger=PropertyChanged也无效。若将编辑用的TextBox移至CellTemplate中,绑定可正常更新,但无法满足显示DisplayedBarcode的需求。其他DataGridTextColumn的绑定均正常,排除MVVM通信问题。
排查结果与解决方案
经排查,问题根源是CellTemplate中的TextBox控件遮挡了CellEditingTemplate内的控件,导致编辑操作无法触发。可通过以下两种方式解决:
- 修改
CellTemplate中TextBox的属性:设置IsReadOnly=True、IsHitTestVisible=False,使其仅用于显示,不响应交互 - 非编辑模式下改用
TextBlock替代TextBox,避免遮挡编辑模板内的控件
内容的提问来源于stack exchange,提问作者fettundhaarig
相关产品推荐
相关产品推荐

