C# DataGrid如何获取CurrentCell的值
我必须访问DataGrid的活动单元格(周围有黑色边框的单元格)下的值 幸运的是,DataGrid有很多属性,比如CurrentCell、CurrentItem SelectedCells SelectedItem和SelectedItems,它们似乎为我提供了所需的数据 然而,我还没有弄明白如何以一种简单的方式访问手机。我也改变了C# DataGrid如何获取CurrentCell的值,c#,.net,wpf,wpfdatagrid,C#,.net,Wpf,Wpfdatagrid,我必须访问DataGrid的活动单元格(周围有黑色边框的单元格)下的值 幸运的是,DataGrid有很多属性,比如CurrentCell、CurrentItem SelectedCells SelectedItem和SelectedItems,它们似乎为我提供了所需的数据 然而,我还没有弄明白如何以一种简单的方式访问手机。我也改变了 SelectionMode="Single" SelectionUnit="Cell" …但最后我不得不这样做: DataGridCellInfo cellInf
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
}
}
}
DataGridCellInfo-cellInfo=dataGrid.CurrentCell;
if(null!=cellInfo&&cellInfo.IsValid)
{
object[]数组=cellInfo.Item作为object[];
if(null!=array&&cellInfo.Column.DisplayIndex>=0&&cellInfo.Column.DisplayIndex
在我的示例中,行是通过包含各种对象类型的对象数组构建的。我知道我可以在cellInfo.Column上执行绑定(在转换之后),但这不是重点。我的问题是,如果我真的做错了什么,因为我无法想象像DataGrid这样功能强大的软件,如果不进行大量编码,就无法为我提供所需的价值
我遗漏了什么,或者获取当前单元格值真的很复杂。
更新
正如Quartermeister在他非常好的回答中所解释的,没有一个属性可以访问cells值,这是有意义的原因的。此外,如果您让用户重新排列列,请注意不要像我在示例中所做的那样使用DisplayIndex。这真的很复杂。问题是DataGridColumn不一定绑定到单个值。例如,只有一个数据模板。模板可能会使用row对象中的多个值,甚至根本没有值,因此无法有效地为该单元格返回单个值 如果列是a(例如a),则可以保证只有一个值。正如您所说,您可以通过执行绑定来获得值。例如,您可以这样做(请注意,这对于使用ElementName或RelativeSource的绑定不起作用,但您可能不会在DataGridBoundColumn中使用这些绑定):
请注意,您可能不想使用DisplayIndex属性,因为如果用户手动拖动列以对其重新排序,则可以更改该属性 为什么需要直接访问该值?datagrid设计用于数据绑定和mvvm模式,这应该可以避免直接访问ui类(在您的情况下是数据网格单元)的需要?如何将当前单元格绑定到视图模型(或必须绑定到哪个属性),以便视图模型可以跟踪当前单元格,而无需像上面那样编写代码。我对这样的解决方案很感兴趣,因为我不喜欢这样做。请看你是否能帮我?+1并接受:谢谢你的详细解释。现在我觉得这很有道理。顺便说一句,执行binding.Wow 7行代码以获取当前单元格值的好方法,它返回NULL。知道是谁为网格设计了这个糟糕的借口吗。我猜微软以前所有优秀的程序员都去了谷歌或AWS。
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;
}
}