【发布时间】:2010-07-17 16:17:32
【问题描述】:
我必须访问位于 DataGrid 的活动单元格(周围有黑色边框的单元格)下面的值。
幸运的是,DataGrid 有很多属性,例如 CurrentCell、CurrentItem SelectedCells SelectedItem 和 SelectedItems 似乎可以为我提供我想要的数据。
但是我还没有弄清楚如何以简单的方式访问单元格。我也改了……
SelectionMode="Single" SelectionUnit="Cell"
...属性,但最后我不得不这样做:
DataGridCellInfo cellInfo = dataGrid.CurrentCell;
if(null != cellInfo && cellInfo.IsValid)
{
object[] array = cellInfo.Item as object[];
if (null != array && cellInfo.Column.DisplayIndex >= 0 && cellInfo.Column.DisplayIndex < array.Length)
{
object cellValue = array[cellInfo.Column.DisplayIndex];
if (null != cellValue)
{
// Here we are
}
}
}
在我的示例中,该行是通过包含各种对象类型的对象数组构建的。我知道我可以在 cellInfo.Column 上执行绑定(在转换之后),但这不是重点。我的问题是,如果我真的做错了什么,因为我无法想象像 DataGrid 这样强大的软件,如果不进行大量编码,就无法为我提供所需的价值。
我错过了什么,或者获取当前单元格值真的如此复杂。
更新
正如 Quartermeister 在他非常好的回答中所解释的那样,没有一个属性可以访问单元格的值,这是一个有意义的原因。此外,如果您让用户重新排列列,请注意不要像我在示例中那样使用 DisplayIndex。
【问题讨论】:
-
为什么需要直接访问值?数据网格旨在与数据绑定和 mvvm 模式一起使用,这应该避免直接访问 ui 类(在您的情况下为数据网格单元)的需要。
-
我不明白 MVVM 在这种情况下如何帮助我?如何将当前单元格绑定到我的视图模型(或我必须绑定到哪个属性),以便我的视图模型跟踪当前单元格,而无需像上面那样编写一些代码。我会对这样的解决方案感兴趣,因为我不喜欢我这样做的方式。
标签: c# .net wpf wpfdatagrid