DataGrid如何获取CurrentCell的值

时间:2010-07-17 16:17:33

标签: c# .net wpf wpfdatagrid

我必须访问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。

1 个答案:

答案 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属性,因为如果用户手动拖动列以对其重新排序,则可以更改该属性。