Eclipse e4 RCP:如何在@Evaluate方法中获取关联的MItem?
在Eclipse e4 RCP命令式表达式中获取对应的MItem
可以直接在@Evaluate方法中获取当前触发评估的MItem,不需要遍历整个MApplication查找。核心是通过IEvaluationContext提取上下文里的目标元素,结合你的模式标签需求,实现通用可见性逻辑。
实现步骤与代码示例
- 定义通用表达式类
这个类通过注入评估上下文和当前模式,提取目标MItem并对比标签判断可见性:
import org.eclipse.e4.core.di.annotations.Evaluate; import org.eclipse.e4.core.di.annotations.Named; import org.eclipse.e4.core.services.context.IEvaluationContext; import org.eclipse.e4.ui.model.application.ui.MItem; public class ModeVisibilityExpression { @Evaluate public boolean evaluate(IEvaluationContext evalContext, @Named("current.mode") String activeMode) { // 从评估上下文获取当前对应的MItem Object targetElement = evalContext.getDefaultVariable(); if (!(targetElement instanceof MItem)) { return false; // 非MItem元素默认隐藏 } MItem targetItem = (MItem) targetElement; // 检查当前模式是否在MItem的标签集合中 for (String tag : targetItem.getTags()) { if (tag.equals(activeMode)) { return true; } } return false; } }
模型编辑器配置
- 对每个需要控制可见性的工具栏/菜单项,在模型编辑器中添加对应模式的标签(比如模式A可见就加标签"A")
- 找到该项的
visible-when属性,选择命令式表达式,绑定到上述ModeVisibilityExpression类
模式切换时更新上下文
在切换程序模式的逻辑中,将当前模式存入Eclipse上下文,触发表达式重新评估:
import org.eclipse.e4.core.contexts.EclipseContextFactory; import org.eclipse.e4.core.contexts.IEclipseContext; // 示例:切换到模式A IEclipseContext appContext = EclipseContextFactory.getServiceContext(getClass().getClassLoader()); appContext.set("current.mode", "A");
关键注意点
IEvaluationContext.getDefaultVariable()返回的就是当前触发评估的UI元素(这里是MItem),这是e4表达式评估机制默认传递的上下文变量- 如果遇到非
MItem的UI元素评估(比如某些容器),可以添加类型判断避免报错 - 上下文更新后,e4会自动触发所有绑定的命令式表达式重新评估,无需手动刷新UI
内容的提问来源于stack exchange,提问作者bern
相关产品推荐
相关产品推荐

