我正在研究遗留代码,我偶然发现了一个问题,它让我陷入了一个星期的困境。我想听听别人对此的看法。
这种情况包括父-子项:当选择父节点时,绑定到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
绑定到视图,但是使用的是ReadOnlyCollection<Child> SelectedChildren
微,所以我认为很多命名约定都在起作用。我怀疑只读是防止选择被清除,但是当删除point2中提到的抑制时,选择确实会被清除。除非这是这两个人之间非常具体的案件组合?!
任何想法、建议或类似的经历都会受到赞赏。
PS:涉及的代码很多,所以我不知道在这里添加哪些代码是有用的。如果你认为有什么特别的地方需要补充,请告诉我。
发布于 2021-08-10 12:12:24
在这种情况下,一些源代码将是有用的。在任何情况下,要在GridControl上调试聚焦问题,都应该检查以下属性:
论GridControl
ItemsSource="{Binding GridItemSource}"
SelectedItems="{Binding SelectedGridItems}"
SelectionMode="Row"
论TableView
FocusedRow="{Binding FocusedRow, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
检查它们是否以某种方式捆绑在一起。还请检查VM上是否有一些DXEvent绑定,如SelectionChanged
。
https://stackoverflow.com/questions/68713259
复制相似问题