【问题标题】:DataGrid how to get the value of the CurrentCellDataGrid如何获取CurrentCell的值
【发布时间】: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 在这种情况下如何帮助我?如何将当前单元格绑定到我的视图模型(或我必须绑定到哪个属性),以便我的视图模型跟踪当前单元格,而无需像上面那样编写一些代码。我会对这样的解决方案感兴趣,因为我不喜欢我这样做的方式。
  • 请看stackoverflow.com/questions/3272910/…也许你能帮忙?

标签: c# .net wpf wpfdatagrid


【解决方案1】:

真的有那么复杂。问题是 DataGridColumn 不一定绑定到单个值。例如,DataGridTemplateColumn 只有一个 DataTemplate。模板可能使用来自行对象的多个值,甚至根本不使用任何值,因此无法有效地为该单元格返回单个值。

如果列是DataGridBoundColumn(例如DataGridTextColumn),则可以保证只有一个值。如您所说,您可以通过执行绑定来获取值。例如,您可以这样做(请注意,这不适用于使用 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 属性,因为如果用户手动拖动列以重新排序,则可以更改该属性。

【讨论】:

  • +1 并接受:感谢您的详细解释。现在这对我来说很有意义。顺便说一句,执行绑定的好方法。
  • 哇 7 行代码来获取当前单元格值,它返回 NULL。任何为网格设计这个糟糕借口的想法。我猜微软过去所有优秀的程序员都去了谷歌或 AWS。
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2012-10-28
  • 2012-12-09
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多