在向导执行完成时刷新Eclipse4RCP视图

在向导执行完成时刷新Eclipse4RCP视图,eclipse,eclipse-rcp,e4,Eclipse,Eclipse Rcp,E4,我运气不太好的菜鸟问题。在我的e4 RCP应用程序中,我有几个实例,其中我在向导中创建了一个对象,然后该对象应该出现在我的一个视图中 所需的行为类似于创建新项目后eclipse Package Explorer视图的更新方式 我想我可以从partService获取视图并运行我自己的更新方法: MPart ingredientsView = partService.showPart("com.personal.recipes.part.ingredientsview", PartState.ACT

我运气不太好的菜鸟问题。在我的e4 RCP应用程序中,我有几个实例,其中我在向导中创建了一个对象,然后该对象应该出现在我的一个视图中

所需的行为类似于创建新项目后eclipse Package Explorer视图的更新方式

我想我可以从partService获取视图并运行我自己的更新方法:

MPart ingredientsView = partService.showPart("com.personal.recipes.part.ingredientsview", PartState.ACTIVATE); 
IngredientsView iv = (IngredientsView) ingredientsView.getObject(); 
iv.updateView();
虽然这在其他地方有效,但当从向导调用“partService”时,它将为null,并且应用程序NPE将退出

那么,在修改e4视图的内容后,强制其更新的被禁止的方法是什么呢

编辑: 我试图使用ContextInjectionFactory,比如在他的回答中显示的@greg-449,但我不确定在代码中放置它的位置,或者如何定义上下文。我将从工具栏按钮启动向导,并在处理程序中放置以下代码:

    @Execute
public void execute(Shell shell) {
    IEclipseContext context = EclipseContextFactory.create();
    IWizard ingredientWizard = ContextInjectionFactory.make(IngredientWizard.class, context);

    WizardDialog wizardDialog = new WizardDialog(shell, ingredientWizard);
    wizardDialog.open();
    }
然而,当我尝试使用@InjectePartService获得部件服务时;我收到一个InjectionException,说没有发现错误


注入可用后,使用EventBroker看起来是一种可行的方法。

注入只在应用程序模型知道的对象上进行。因此,除非在创建对话框时使用
ContextInjectionFactory
进行“手动”操作,否则不能在向导或对话框上执行此操作:

IWizard wizard=ContextInjectionFactory.make(YourWizardClass.class,eclipseContext);
WizardDialog=新建WizardDialog(shell,向导);
这将在您的向导类上进行注入,使您能够访问
EPartService


您还可以使用“事件代理”(
IEventBroker
)向感兴趣的任何人广播事件,而不是查找您的特定视图。

在此处输入代码
更新视图的最佳方法是使用视图内容的模型。您的向导似乎允许编辑或创建成分。完成向导时,您可能正在修改某些成分数据。应将这些变化告知成分模型。如果视图使用观察此模型的内容提供程序,则当模型看到更新时,它将自动更新(这是观察者模式)。 其工作方式取决于数据的性质。您可以使用Java中的PropertyChange支持

为此,让内容提供者实现
org.eclipse.jface.util.IPropertyChangeListener
接口,并在数据更改时触发属性更改事件

更新


我的ContentProvider实现属性更改接口。每当收到属性更改事件时,都会刷新查看器(异步)。我的所有持久化操作都由数据管理器处理,类似于Fowler的表数据网关模式,但有时用于多个表。数据管理器触发属性更改事件。这样,UI(向导)就不需要知道持久性了

谢谢@Stefan的回复。我确实使用XCore建立了一个模型,并使用它来更新有关现有对象的视图和编辑器。但是我遇到的问题是在添加新对象时更新视图。视图只包含一个TreeViewer,它调用我的数据库来构建它的内容。我想要的是在用户完成向导后刷新视图,以便它调用DB以获取任何新数据。我可以直接向TreeViewer添加一个侦听器吗?如何通知视图发生了应导致刷新的事件?@BiggPlanet使用e4事件代理将事件广播到任何想要处理它们的对象-请参阅@BiggPlanet:My ContentProvider实现属性更改接口。每当收到属性更改事件时,都会刷新查看器(异步)。我的所有持久化操作都由数据管理器处理,类似于Fowler的表数据网关模式,但有时用于多个表。数据管理器触发属性更改事件。这样,UI(向导)就不需要了解持久性。您的回答让我找到了一个相当简单的解决方案。我只是将EPartService注入到我的处理程序中,获取对视图的引用,并通过其构造函数将其传递给向导。现在我可以调用我的刷新方法了,没问题,它工作得很好。来自@Stefan的建议可能是一种更加优雅的方法,因此我将研究如何在模型中创建包装器对象,并以相同的方式将其传递给向导。这样我就可以轻松访问事件调用。非常感谢你们两位的帮助!