JFace TableViewer - 如何在调用 setInput(...) 后正确触发 SelectionChanged()?

JFace TableViewer - how to properly fireSelectionChanged() after calling setInput(...)?

我在包含 TableViewer 的 RCP 程序中有一个编辑器。 TableViewer 的内容可以作为编辑器中 Action 的结果进行更新。目前这是通过创建新输入并调用

来完成的
tableViewer.setInput(updatedInput);

不幸的是,这不会发送 SelectionChangedEvent,直到编辑器失去焦点或在 table 中做出新的选择。这会导致 Command 出现问题,它通过 HandlerUtil.getCurrentSelection(event) -

获取当前选择
ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
...
...//call an action.
...//Inside the action:
Collection<Foo> selectedFoos = HandlerUtil.getCurrentSelection(event).toList();
//No good! We get the unchanged selection back!

我看到有两种方法可以解决这个问题。遍历输入并调整现有对象而不是调用 setInput() 可能会起作用,但在我的情况下不是一个选项。相反,我想触发一个 SelectionChangedEvent,它将使 HandlerUtil 更新其 currentSelection 变量。目前,我是这样实现的:

ISelection oldSelection = tableViewer.getSelection();
Collection<Foo> newFoos = fooAction.createNewFoos();
tableViewer.setInput(newFoos);
ISelection selection = tableViewer.getSelection();
tableViewer.setSelection(null);
tableViewer.setSelection(selection);

这有效,因为选择会发生变化,这会强制触发一个事件。但这也是一个丑陋的 hack,即使有评论,我认为这可能会使将来查看这段代码的任何人感到困惑。

那么在所有这些都已解决的情况下,是否有适当的方法让 TableViewer 发射 SelectionChangedEvent?我可以使用适当的 ContentProvider 使它自动发生吗?或者我可以通过从视图或编辑器中触发 属性 更改来以某种方式完成此操作吗?

如有任何提示,我们将不胜感激!

除了您应该将选择设置为空而不是 null 之外,您显示的内容很好:

tableViewer.setSelection(StructuredSelection.EMPTY);