HCL*_*HCL 3 .net c# wpf wpfdatagrid
我必须访问DataGrid的活动单元格下面的值(围绕它的黑色边框的单元格).
幸运的是DataGrid有很多属性,比如CurrentCell,CurrentItem SelectedCells SelectedItem和SelectedItems似乎为我提供了我想要的数据.
但是,我还没有弄清楚如何以简单的方式访问单元格.我也改变了......
SelectionMode="Single" SelectionUnit="Cell"
Run Code Online (Sandbox Code Playgroud)
......属性但最后我必须做这样的事情:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的示例中,该行是通过包含各种对象类型的对象数组构建的.我知道我可以在cellInfo.Column上执行绑定(在演员之后),但这不是重点.我的问题是,如果我做了一些非常错误的事情,因为我无法像DataGrid那样成像那么强大的软件,如果不进行如此大量的编码就无法为我提供所需的价值.
我错过了什么,或者获得当前单元格值是否真的如此复杂.
UPDATE
正如Quartermeister在他非常好的答案中解释的那样,没有一个属性可以访问单元格值,这是有意义的原因.另外,如果你让用户重新安排列,请注意像我在我的例子中那样使用DisplayIndex.
真的很复杂.问题是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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可能不希望使用DisplayIndex属性,因为如果用户手动拖动列以对其重新排序,则可以更改该属性.