0

テーブルにEMFデータバインディングを追加する方法について、Tom Shindlの指示に従っています。データバインディングのコードは次のとおりです

protected DataBindingContext initDataBindings() {

    //going to use this person instead
    Person p = ProjectFactory.eINSTANCE.createPerson();
    p.setFirstName("tony");

    Committership c = ProjectFactory.eINSTANCE.createCommittership();
    c.setName("HELP");

    Committership anotherC = ProjectFactory.eINSTANCE.createCommittership();
    anotherC.setName("PELASE");

    Committership yetAnotherC = ProjectFactory.eINSTANCE.createCommittership();
    yetAnotherC.setName("EMERGENCY");

    p.getCommittership().add(c);
    p.getCommittership().add(anotherC);
    p.getCommittership().add(yetAnotherC);

    CommandStack cs = new BasicCommandStack();
    AdapterFactory af = new ProjectItemProviderAdapterFactory();
    EditingDomain editingDomain = new AdapterFactoryEditingDomain(af, cs);

    //data binding context
    DataBindingContext bindingContext = new DataBindingContext();
    //
    ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
    IObservableMap[] attributeMap = new IObservableMap[1];
    attributeMap[0] = EMFEditProperties.value(
              editingDomain,
              FeaturePath.fromList(ProjectPackage.Literals.COMMITTERSHIP__NAME)
            ).observeDetail(listContentProvider.getKnownElements());

    TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
    column.getColumn().setText("First Name");
    column.getColumn().setWidth(200);
    column.setLabelProvider(new GenericMapCellLabelProvider("{0}", attributeMap));
    //tableViewer.setLabelProvider(new ObservableMapLabelProvider(attributeMap)); -- no need for this anymore
    tableViewer.setContentProvider(listContentProvider);

    //instead of giving it this list and doing it the non-EMF way
    IObservableList selfList = Properties.selfList(Person.class).observe(p.getCommittership());

    //property that you are looking for
    IListProperty prop = EMFEditProperties.list(editingDomain, ProjectPackage.Literals.PERSON__COMMITTERSHIP);
    IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME)
            .observe(p);

    /**this should not be returning null, instead it should be a
     *  list of the values from the person committership EList
     */
    IObservableList someList = prop.observeDetail(master);

    //set input requires and IObservableList!!
    tableViewer.setInput(someList);
    //
    return bindingContext;
}

わかりました、今何が起こっているのか、どこで行き詰まっているのかを話しましょう。

この行は、JFace データ バインディングで機能します。 IObservableList selfList = Properties.selfList(Person.class).observe(p.getCommittership());

これは、私が追加した 3 人を含むリストです。

EMFデータバインディングで動作するようになりました。これを試しています:

//探しているプロパティ

IListProperty prop = EMFEditProperties.list(editingDomain, ProjectPackage.Literals.PERSON__COMMITTERSHIP);
IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME)
        .observe(p);

/**this should not be returning null, instead it should be a
 *  list of the values from the person committership EList
 */
IObservableList someList = prop.observeDetail(master);

問題は、それsomeListが空であるため、テーブルにデータが入力されないことです。誰かが理由を説明できますか? そこに論理的な問題があるのは間違いなくこれらの3行です。私が本当に欲しいのは、IObservableList観測されたEMFオブジェクトの...

Shindl のチュートリアルでは、彼がどこからマスターを作成するかを説明していないため、助けていただければ幸いです...私はマスターを作成すると思いました:

IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME)
                .observe(p);

そして、やりますprop.observeDetail(master)

しかし、上記のように空のリストを返しています...少なくともデータを表示できれば、最も近いのは3つのセルがありますが、データはありません。

4

1 に答える 1