2010-07-17 62 views
3

我必须访问DataGrid的活动单元格(其周围有黑色边框的单元格)的值。DataGrid如何获取CurrentCell的值

幸运的是,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这样一个如此强大的软件,如果不进行如此多的编码就无法提供所需的价值。

我错过了什么,或者它是否真的如此复杂以获得当前的单元格值。

UPDATE

由于Quartermeister在他很好的答案解释,没有进入细胞值的一个属性,这是有一个meaningfull原因。此外,如果让用户重新排列列,请注意像我在示例中那样使用DisplayIndex。

+0

为什么您需要直接访问该值? datagrid被设计为可以与数据绑定和mvvm模式一起工作,这应该避免直接访问ui类(在你的情况下是数据网格单元格)。 – 2010-07-17 18:28:31

+0

在这种情况下,我看不出MVVM如何帮助我?如何将当前单元格绑定到我的视图模型(或我必须绑定的属性),以便我的视图模型跟踪当前单元格,而无需像上面那样编写一些代码。我会对这样的解决方案感兴趣,因为我不喜欢我的方式。 – HCL 2010-07-17 18:56:10

+0

请参阅 http://stackoverflow.com/questions/3272910/fill-a-datagrid-with-data-that-lies-in-a-array 也许你可以帮忙吗? – HCL 2010-07-17 19:19:18

回答

6

真的很复杂。问题是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属性,因为如果用户手动拖动列来重新排列列,那么可以更改该属性。

+0

+1和接受:感谢这个详细的解释。现在对我来说很有意义。顺便说一句,很好的方式来执行绑定。 – HCL 2010-07-17 18:43:19

+0

谢谢! Jeeze,似乎真的不应该做那么多工作...... – 2015-09-23 17:11:17