我已经查看了这个问题Eclipse force handlers to re-evaluate和 Paul Webster 提供的答案。为什么在处理程序中使用activeWhen元素不起作用?仅当我将以下 plugin.xml 更改为使用enabledWhen元素时,它才会起作用。运行命令后,我的特定命令不应再启用。
<handler
commandId="org.eclipse.jpt.jpa.ui.xmlFileUpgradeToLatestVersion"
class="org.eclipse.jpt.jpa.ui.internal.commands.UpgradeXmlFileVersionHandler">
<activeWhen>
<iterate ifEmpty="false">
<or>
<adapt type="org.eclipse.jpt.jpa.core.context.XmlFile">
<test property="org.eclipse.jpt.jpa.core.isNotLatestSupportedVersion"/>
</adapt>
<adapt type="org.eclipse.jpt.common.core.resource.xml.JptXmlResource">
<test property="org.eclipse.jpt.jpa.core.isNotLatestSupportedVersion"/>
</adapt>
</or>
</iterate>
</activeWhen>
</handler>
在我的处理程序执行结束时,我调用:
IEvaluationService service = (IEvaluationService) activeWorkbenchWindow.getService(IEvaluationService.class);
service.requestEvaluation("org.eclipse.jpt.jpa.core.isNotLatestSupportedVersion");
更新:我做了更多调查,发现 4.2.1 与 3.8.1 相比出现了回归。即使我切换到使用enabledWhen并使用对 requestEvaluation 的调用,我仍然会在快速访问中看到该命令。我通过快速访问使用命令,然后立即再次使用快速访问,我看到命令仍然存在,如果单击它会得到 NotEnabledException。这适用于 3.8.1。
此特定命令不会打开对话框,但我添加了一个确认对话框,现在我的命令已从快速访问中删除!这甚至没有使用IValuationService.requestEvaluation。焦点的变化是否使处理程序得到重新评估?