ItemsSource 更新后清除 GridControl 聚焦的行
Clear GridControl focused row after ItemsSource updated
我正在处理遗留代码,我偶然发现了一个让我卡住了一周的问题。我想听听其他人对此的看法。
案例包括父子项:当父节点被选中时,绑定到BindingList<Child> children
的devexpress.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
.
我正在处理遗留代码,我偶然发现了一个让我卡住了一周的问题。我想听听其他人对此的看法。
案例包括父子项:当父节点被选中时,绑定到BindingList<Child> children
的devexpress.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
.