C# DataGrid点击空白区域触发ContextMenuOpening报错及相关疑问
问题解答
1. 为什么此处用TextBlock才能正常运行,TextBlock的作用是什么?
- WPF的DataGrid单元格默认有两种状态:非编辑状态下,单元格内容由TextBlock控件承载,仅用来展示只读文本;只有触发单元格进入编辑状态时,才会替换为可输入的TextBox控件。
- 你右键点击选中行时,单元格处于默认的只读展示状态,内部控件就是TextBlock,参考代码里用TextBox做类型转换会得到null值,自然无法正常运行。这里TextBlock的作用就是承载非编辑状态下单元格的只读文本内容。
2. 点击空白区域报错,如何仅在右键点击行时触发逻辑?
你遇到的System.ArgumentOutOfRangeException异常是因为右键点击空白区域时,DataGrid没有选中的行,SelectedCells集合是空的,直接访问索引[0]就会触发数组越界错误。可以通过在事件开头加合法性校验解决,没有选中项时直接阻止右键菜单弹出:
string factorselectedid; private void FactorGrid_ContextMenuOpening(object sender, ContextMenuEventArgs e) { // 校验是否存在有效选中行和选中单元格 if (FactorGrid.SelectedItem == null || FactorGrid.SelectedCells.Count == 0) { // 标记事件已处理,阻止菜单弹出 e.Handled = true; return; } object item = FactorGrid.SelectedItem; factorselectedid = (FactorGrid.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text; }
补充优化建议:如果你的DataGrid是绑定了强类型的实体集合,更稳妥的做法是直接把
SelectedItem转换为对应的实体类,直接读取ID属性,不需要通过控件获取值,不会受列顺序、单元格模板变更的影响:// 替换为你实际绑定的实体类名 var factorEntity = FactorGrid.SelectedItem as FactorEntity; factorselectedid = factorEntity?.ID.ToString();
内容的提问来源于stack exchange,提问作者Arsalan Ahmadi
相关产品推荐
相关产品推荐

