在ItemsSource更新后清除GridControl聚焦行



我正在处理遗留代码,我偶然发现了一个问题,让我卡住了一个星期。我想听听别人的意见。

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

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

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

问题3:第一次将子元素加载到空表视图时,第一行默认被选中。这可以通过在XAML中将AllowInitiallyFocusedRow设置为false来阻止。在研究这个问题时,我发现KeepFocusedRowOnUpdate可以设置为false来实现期望的行为。然而,KeepFocusedRowOnUpdate不可用于正在使用的GridControl,我找不到任何等效的。令我震惊的是,Devexpress支持中心上有许多关于实现相反目标的帖子,人们想要保留/保留/保留以前的选择。这使我的搜索更加困难。

问题4:VM保存的ReadOnlyCollection<Child> SelectedChildren没有显式绑定到视图,但使用了Caliburn micro,所以我想有很多命名约定在起作用。我怀疑只读使选择不被清除,但当删除点2中提到的抑制时,选择确实被清除了。除非这两者之间有特殊的案例组合!

任何想法,指针,或类似的经验都是赞赏的。
PS:涉及到很多代码,所以我不知道在这里添加哪些代码会有用。如果您认为有什么需要补充的,请告诉我。

在这种情况下,一些源代码将是有用的。在任何情况下,要调试GridControl上的聚焦问题,您应该检查以下属性:

OnGridControl

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

OnTableView

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

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

相关内容

  • 没有找到相关文章

最新更新