我必须访问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。
答案 0 :(得分:6)
真的很复杂。问题是DataGridColumn不一定绑定到单个值。例如,DataGridTemplateColumn只有一个DataTemplate。模板可以使用行对象中的多个值,甚至根本不使用任何值,因此无法有效地为该单元格返回单个值。
如果列为DataGridBoundColumn(例如DataGridTextColumn),则可以保证只有一个值。如您所说,您可以通过执行Binding来获取值。例如,你可以这样做(请注意,这不适用于使用ElementName或RelativeSource的绑定,但你可能不会在DataGridBoundColumn中使用它们):
var cellInfo = dataGrid.CurrentCell;
if (cellInfo != null)
{
var column = cellInfo.Column as DataGridBoundColumn;
if (column != null)
{
var element = new FrameworkElement() { DataContext = cellInfo.Item };
BindingOperations.SetBinding(element, FrameworkElement.TagProperty, column.Binding);
var cellValue = element.Tag;
}
}
请注意,您可能不希望使用DisplayIndex属性,因为如果用户手动拖动列以对其重新排序,则可以更改该属性。