我意识到这个问题现在有点老了,但希望这些信息会对某人有所帮助。
据我所知,DataGrid 没有公共 API 可以读取选择锚点,也没有在不清除现有选择的情况下设置选择锚点。
为了解决这个问题,我查看了 WPF 的源代码(在撰写本文时,this 用于 .NET Framework 4.8,this 用于 .NET(以前称为 .NET Core))并确定选择锚点似乎仅由名为 _selectionAnchor 的 Nullable<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 中多年来几乎没有变化,所以希望你会没事。
为了安全起见,您可能会添加单元测试来验证您正在访问的私有/内部功能是否继续存在并以您需要的方式运行,这样您的应用程序就不会被巧妙地破坏在更新您使用反射访问私有/内部功能的包之后的运行时。
我要强调的是,项目的单元测试在其依赖项中测试功能是不寻常的,但在我看来,这似乎是一个有点独特的情况。