【问题标题】:How to get "Anchor" cell of SelectedCells in WPF DataGrid?如何在 WPF DataGrid 中获取 SelectedCells 的“锚”单元格?
【发布时间】:2018-08-14 18:08:43
【问题描述】:

我正在编写 WPF 程序,该程序通过绑定到 DataGrid 的 ItemsSource 属性来显示 DataTable。

我设置了以下 DataGrid 的属性以选择多个单元格。

SelectionMode="Extended"
SelectionUnit="CellOrRowHeader"

此外,我想在后面的代码中添加一个处理程序,将值设置为 DataGrid 的 SelectedCells 属性并更改“锚”单元格(我的意思是,锚单元格是在使用 Shift 键选择其他单元格期间始终包含在 SelectedCells 中的唯一单元格)。

但我不知道如何以编程方式访问 Anchor cell 的信息。

请给我建议。 感谢您的帮助。

【问题讨论】:

  • 嗨@Daniel你找到任何解决方案了吗?我遇到了同样的问题...
  • 嗨@OmGanesh。我编辑了问题,我不是 OP

标签: c# wpf datagrid


【解决方案1】:

我意识到这个问题现在有点老了,但希望这些信息会对某人有所帮助。

据我所知,DataGrid 没有公共 API 可以读取选择锚点,也没有在不清除现有选择的情况下设置选择锚点。

为了解决这个问题,我查看了 WPF 的源代码(在撰写本文时,this 用于 .NET Framework 4.8,this 用于 .NET(以前称为 .NET Core))并确定选择锚点似乎仅由名为 _selectionAnchorNullable<DataGridCellInfo> 类型字段处理。

对于以编程方式调整DataGrid 选择的任何人,您只需在操作后设置_selectionAnchor,以便后续 SHIFT 选择操作正常运行。

如果您想清除刚刚以编程方式取消选择所有单元格的选择锚,只需将选择锚设置为null

你可以找到更多关于反射的信息here

TLDR:使用反射访问私有_selectionAnchor 字段

例如:
// These lines of code are not intended to do anything more than demonstrate usage of reflection to get and set this private field.
// In reality you'd be passing SetValue() something other than the value the field was already set to.
var fieldInfo = typeof(DataGrid).GetField("_selectionAnchor", BindingFlags.Instance | BindingFlags.NonPublic);

var anchorCellInfo = fieldInfo.GetValue(dataGridInstance) as DataGridCellInfo?;

fieldInfo.SetValue(dataGridInstance, anchorCellInfo);

注意:使用反射来访问私有/内部功能总是会带来风险,即您正在访问的东西的维护者可能会在未来版本的任何时候更新这些私有/内部部分,而无需事先警告。也就是说,据我所见,这个特殊功能在 WPF 中多年来几乎没有变化,所以希望你会没事。

为了安全起见,您可能会添加单元测试来验证您正在访问的私有/内部功能是否继续存在并以您需要的方式运行,这样您的应用程序就不会被巧妙地破坏在更新您使用反射访问私有/内部功能的包之后的运行时。

我要强调的是,项目的单元测试在其依赖项中测试功能是不寻常的,但在我看来,这似乎是一个有点独特的情况。

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多