DataGrid单元格编辑后无法访问CellEditEnding事件参数中的Text属性问题咨询
DataGrid单元格编辑后无法访问CellEditEnding事件参数中的Text属性问题咨询
兄弟我太懂你这种调试时的困惑了!之前我也盯着调试器里的属性一脸懵,明明看到有Text,写代码就是调不出来,简直挠头😅
先给你说清楚原因:你在调试器里看到的Text属性,根本不是CellEditEndingEventArgs的属性,而是单元格编辑时临时生成的编辑控件(比如TextBox)的属性!调试器会把事件参数关联的内部对象属性也显示出来,但这些属性并没有暴露给我们的代码,所以直接访问自然会报错。
至于FrameworkElement里没有Text属性也很正常——DataGrid的单元格编辑控件可不是只有TextBox一种,还可能是ComboBox、DatePicker甚至自定义控件,所以事件参数不可能统一提供一个Text属性,得根据实际的编辑控件类型来处理。
给你两个靠谱的解决方案:
方案一:直接获取编辑控件的对应值
通过事件参数的e.EditingElement拿到当前正在使用的编辑控件,然后转换成对应的类型再取值:
private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { // 如果是TextBox类型的编辑控件 if (e.EditingElement is TextBox editTextBox) { string editedText = editTextBox.Text; // 这里写你的业务逻辑 } // 如果是ComboBox的话 else if (e.EditingElement is ComboBox editComboBox) { var selectedValue = editComboBox.SelectedValue; // 处理下拉框的选中值 } }
方案二:从绑定的数据源直接取值
只要你的DataGrid是用数据绑定(默认是TwoWay模式),编辑完成后值会自动同步到数据源对象里,所以直接从行对应的Item里取就行:
private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { // 把Item转换成你的数据模型类型 var targetItem = e.Row.Item as YourDataModel; if (targetItem != null) { // 直接访问模型里对应的属性 string latestValue = targetItem.YourTargetProperty; } }
以后再遇到调试器里能看到但代码里访问不了的属性,先看看是不是关联对象的属性,别被调试器的显示给误导啦!
备注:内容来源于stack exchange,提问作者sJames
相关产品推荐
相关产品推荐

