0

我正在阅读Tom Shindl关于如何将 EMF 数据绑定添加到表的说明,这是我的数据绑定代码:

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());

它愉快地填充了表格,它是一个包含我添加的三个人的列表,很好。

现在使它与 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是空的,因此他的表不会填充,有人可以解释为什么吗?肯定是那三行有一些逻辑问题。我真正想要的是IObservableList观察到的 EMF 对象......

非常感谢您的帮助,因为 Shindl 的教程没有解释他从哪里获得大师...我想我会创建一个大师:

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

prop.observeDetail(master)

但正如我上面提到的,它返回一个空列表......如果我至少可以让它显示数据,我最接近的是有三个单元格,但其中没有数据。

4

1 回答 1

0
IObservableList listObservable = prop.observe(p);
tableViewer.setInput(listObservable);

在查看数据方面,这为我解决了问题。

至于编辑单元格,我最后这样做了:

public class CommittershipNameEditingSupport extends EditingSupport {

    private static TableViewer tableViewer;
    private final CellEditor editor;

    public CommittershipNameEditingSupport(TableViewer tableViewer) {
        super(tableViewer);
        this.tableViewer = tableViewer;
        this.editor = new TextCellEditor(tableViewer.getTable());
    }

    @Override
    protected CellEditor getCellEditor(Object element) {
        return editor;
    }

    @Override
    protected boolean canEdit(Object element) {
        return true;
    }

    @Override
    protected Object getValue(Object element) {
        return ((Committership) element).getName();
    }

    @Override
    protected void setValue(Object element, Object value) {
        ((Committership) element).setName(String.valueOf(value));
        tableViewer.update(element, null);
    }



}

在我创建列的主视图中,我刚刚添加了单元格编辑支持的方法......现在效果很好:)

于 2014-10-24T11:40:27.083 回答