我正在处理遗留代码,我偶然发现了一个问题,让我卡住了一个星期。我想听听别人的意见。
案例包含父子项:当选择父节点时,将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
。