2

次のタイプの単純な EMF モデルがあります。

EClass FooGroup {
    EString name;
    @Properties(containment=true, upper=-1)
    List<Node> nodes;
}
EClass BarGroup {
    EString name;
    @Properties(containment=true, upper=-1)
    List<Node> nodes;
}
EClass Node {
    EString name;
}

TableViewer親グループの名前とともに、ノードのすべての名前を単純な で表示したいと思います。残念ながら、eContainer()これは操作であり機能ではありません。つまり、JFace Databinding フレームワークを使用してこのプロパティを GUI にリンクすることはできません。

どうすればこの問題を解決できますか? 派生フィーチャーを作成しますか? 何かコツはありますか?

4

4 に答える 4

3

EMFデータバインディングでeContainerを使用する方法を考えることはできませんが、指定された親参照をノードに追加し、eContainerが変更されるたびにプログラムで更新することはそれほど難しくありません。

別の解決策は、親を追加してから、生成されたコードを変更することです。

/*
 * @generated NOT
 */
public Group getParent() {
    if (eContainer() instanceof Group) {
        return (Group) eContainer();
    }
    return null;
}

次に、FeaturePathを使用して、次のようにEMFPropertyを取得できます。

    IEMFProperty groupNameProperty = EMFProperties.value(
      FeaturePath.fromList(
        ModelPackage.Literals.NODE__PARENT,
        ModelPackage.Literals.GROUP__NAME
      )
    );
于 2012-05-05T08:34:12.487 に答える
0

これを解決するカスタム コンテナー プロパティ クラスを作成することができます。

そうすれば、コンテナにバインドできるようにモデル クラスを変更する必要はありません。新しいプロパティは、すべての電子オブジェクトに役立ちます。

public static IValueProperty containerProperty() {
    return new ContainerProperty();
}

public class ContainerProperty extends ValueProperty {
    @Override
    public IObservableValue observe(Realm realm, Object source) {
        return Observables.constantObservableValue(realm, 
            source == null ? null : ((EObject) source).eContainer(), 
            getValueType());
    }

    @Override
    protected Object doGetValue(Object source) {
        return ((EObject) source).eContainer();
    }

    @Override
    public Object getValueType() {
        return EObject.class;
    }
};

使用例:

IObservableValue obs = containerProperty().observeDetail(node);

このクラスはコンテナの変更をリッスンしません。しかし、そのようなプロパティを実装することは可能だと思います。たぶん、SimpleValuePropertyクラスを使用するのがそれに適しているでしょう。

于 2017-07-01T08:18:40.637 に答える