Eclipse rcp 如何在TreeViewer中正确使用EMF数据绑定

Eclipse rcp 如何在TreeViewer中正确使用EMF数据绑定,eclipse-rcp,jface,eclipse-emf,Eclipse Rcp,Jface,Eclipse Emf,我想将我的EMF模型绑定到TreeViewer。我的模型如下所示: Facility : Name - Part : Name - SubPart : SubPartName - SubSubPart : SubSubPartName - SubSubPart : SubSubPartName - SubSubPart : SubSubPartName - SubPart : SubPartN

我想将我的EMF模型绑定到
TreeViewer
。我的模型如下所示:

Facility : Name
   - Part : Name 
       - SubPart : SubPartName
          - SubSubPart : SubSubPartName
          - SubSubPart : SubSubPartName
          - SubSubPart : SubSubPartName    
       - SubPart : SubPartName
  - Part : Another Name   
      - SubPart : SubPartName
我遵循了Tom Schindl的教程,但我仍然不理解如何实现
TreeFactoryImpl
。目前看来是这样的:

Facility : Name
   - Part : Name 
       - SubPart : SubPartName
          - SubSubPart : SubSubPartName
          - SubSubPart : SubSubPartName
          - SubSubPart : SubSubPartName    
       - SubPart : SubPartName
  - Part : Another Name   
      - SubPart : SubPartName
@覆盖
公共IObservable createObservable(对象目标){
if(IObservableList的目标实例){
返回(IObservable)目标;
}else if(设施的目标实例){
IEMFListProperty multi=EMFProperties.multiList(ModelPackage.Literals.FACILITY\uu NAME);
返回多个观察(目标);
}else if(零件的目标实例){
IEMFListProperty multi=EMFProperties.multiList(ModelPackage.Literals.PART\u NAME);
返回多个观察(目标);
}
返回null;
}
问题是只显示设备。现在这是一个奇迹,因为
treestStructureAdvisor
似乎只接收字符串

我想完成的是:

1.) Update the TreeViewrt if new nodes are added
2.) Update the name label if the name is changed
摘自此处:此方法看起来与您正在使用的方法不同

private static class TreeFactoryImpl implements IObservableFactory {

    private IEMFListProperty multi = EMFProperties.multiList(
            WorkspacePackage.Literals.PROJECT_SPACE__PROJECT,
            MetamodelPackage.Literals.PROJECT__MODEL_ELEMENTS);

    public IObservable createObservable(final Object target) {
        if (target instanceof IObservableList) {
            return (IObservable) target;
        } else if (target instanceof ProjectSpace) {
            return multi.observe(target);
        } else if (target instanceof Project) {
            return multi.observe(target);
        }

        return null;
    }
}
从我在那里看到的情况来看,对multilist的大多数示例调用都是使用两个列表进行的。您使用它有什么原因吗?

以下方法有效:

@Override
public IObservable createObservable(Object target) {

    if (target instanceof IObservableList) {
        return (IObservable) target;
    } else if (target instanceof Facility) {
        IEMFListProperty list = EMFProperties.list(ModelPackage.Literals.FACILITY__SUBPARTS);
        return list.observe(target);
    } else if (target instanceof SUBPART) {
        IEMFListProperty list = EMFProperties.list(ModelPackage.Literals.SUBPART__SUBPARTS);
        return list.observe(target);
    } else {
        return null;
    }
}
这里的关键是收听收藏。这解决了需求1(如果添加了新节点,则更新树视图)

之后,我添加了一个TreeLabelProvider,正如Tom Schindl在博客文章中所描述的那样。 这解决了要求2(如果名称发生更改,则更新名称标签)