ItemsSource 更新后清除 GridControl 聚焦的行

Clear GridControl focused row after ItemsSource updated

我正在处理遗留代码,我偶然发现了一个让我卡住了一周的问题。我想听听其他人对此的看法。

案例包括父子项:当父节点被选中时,绑定到BindingList<Child> childrendevexpress.xpf.Grid被填充相应的数据。比如说,网格中有一行 selected/highlighted。选择另一个父节点时,清除了children列表,添加了新项目,并成功地显示在网格中。
实际行为:先前选择的行将保持选中状态。
期望的行为:在更新内容时清除选择。

关注1: ItemsSourceChanged 将在第一次加载时触发一次,但不会在每次更新时触发。我相信这是因为项目源本身没有改变,对象引用仍然相同,但内容已更新并且我找不到 ItemsSourceUpdated。此外,尽管将 NotifyOnTargetUpdated 设置为 true 并且 Child 实现了 INotifyPropertyChanged.

,但 TargetUpdated 也仅在第一次加载时触发一次

关注2: 更新子列表时,ListChangedEvent 被抑制以避免触发每个添加的项目。 RaiseListChangedEvents 设置为 false,一些业务逻辑发生,然后 RaiseListChangedEvents 设置回 true,然后 ResetBindings() 触发事件。移除此抑制后,将根据需要清除选择。我想有些东西被禁用但没有再次启用?!

关注3: 对于第一次将子项加载到空表视图中,默认选择第一行。这可以通过在 XAML 中将 AllowInitiallyFocusedRow 设置为 false 来停止。在研究这个问题时,我发现可以将 KeepFocusedRowOnUpdate 设置为 false 以实现所需的行为。但是,KeepFocusedRowOnUpdate 不适用于正在使用的 GridControl,我找不到任何等效项。令我震惊的是,Devexpress 支持中心上有很多线程实现相反的目标,人们希望 keep/retain/preserve 以前的选择。这让我的搜索更加困难。

关注4: VM 持有 ReadOnlyCollection<Child> SelectedChildren 未明确绑定到视图,但使用了 Caliburn micro,所以我想很多命名约定都在起作用。我怀疑 readonly 阻止了选择被清除但是当删除第 2 点中提到的抑制时,选择确实被清除了。除非它是这两者之间非常具体的案例组合?!

如有任何想法、建议或类似经验,我们将不胜感激。
PS: 涉及的代码很多,不知道加到这里哪个有用。如果有任何您认为有帮助的具体内容,请告诉我。

在那种情况下,一些源代码会很有用。无论如何要调试 GridControl 上的聚焦问题,您应该检查以下属性:

GridControl

  ItemsSource="{Binding GridItemSource}"
  SelectedItems="{Binding SelectedGridItems}"
  SelectionMode="Row"

TableView

FocusedRow="{Binding FocusedRow, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

检查它们是否以某种方式绑定在一起。还要检查 VM 上是否有一些 DXEvent 绑定,例如 SelectionChanged.