RCP E4应用@CanExecute注解不生效导致发货按钮无法正常禁用问题
问题原因
- E4框架的
UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC事件仅支持传入参数为UIEvents.ALL_ELEMENT_ID时,才会触发全局所有@CanExecute方法的返回值同步到UI按钮状态。你代码中传入自定义布尔值check属于无效参数,框架不会识别并更新按钮状态。 - 你在
@CanExecute方法上额外添加的@UIEventTopic注解,仅会让该方法被事件总线触发执行,但这个执行结果不会被E4框架用于更新按钮的启用状态,E4仅会在自身的命令状态更新生命周期中调用@CanExecute方法并读取返回值同步UI。 @CanExecute方法不应该依赖事件传参获取状态,正确逻辑是方法执行时主动从上下文中读取最新的选中状态判断,避免状态和UI不同步。
解决方法
1. 修改视图层事件触发逻辑
将事件发布的参数改为UIEvents.ALL_ELEMENT_ID,通知框架全局刷新所有命令的启用状态:
if (selection.getFirstElement() instanceof Package) { // 不需要传自定义参数,用ALL_ELEMENT_ID触发全局状态更新 broker.post(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, UIEvents.ALL_ELEMENT_ID); }
2. 重写ShipmentHandler的canExecute方法
移除@UIEventTopic注解,直接注入上下文的选中对象判断状态:
public class ShipmentHandler { @Execute public void execute(Shell shell) { //TODO } @CanExecute public boolean canExecute(@Named(IServiceConstants.ACTIVE_SELECTION) Object selection) { // 直接从上下文获取当前选中项判断状态 if (selection instanceof Package pkg) { return pkg.isReadyToShip(); } // 未选中有效Package时默认禁用按钮 return false; } }
也可以注入ESelectionService获取选中状态,效果一致。
修改后触发选择事件时,框架会主动调用canExecute方法获取最新返回值,同步更新发货按钮的启用状态。
内容的提问来源于stack exchange,提问作者J Robes
相关产品推荐
相关产品推荐

