EMF编辑域命令创建

时间:2012-02-10 08:43:46

标签: java eclipse eclipse-emf

我现在正在深入研究EMF,并遇到了以下问题:

我正在尝试使用以下代码从fieldset中删除字段:

 FieldElem ff = ds.getContent().getNestedFieldset().get(0).getField().get(0);

            Command remove = new RemoveCommand(editingDomain, nf, 
                           DescPackage.eINSTANCE.getNestedFieldsetElem_Field(), ff);
            editingDomain.getCommandStack().execute(remove);

            ff = ds.getContent().getNestedFieldset().get(0).getField().get(0);

            Command remove2 = RemoveCommand.create(editingDomain, nf, 
                    DescPackage.eINSTANCE.getNestedFieldsetElem_Field(), ff);
            editingDomain.getCommandStack().execute(remove2);

            ff = ds.getContent().getNestedFieldset().get(0).getField().get(0);

            Command remove3 = RemoveCommand.create(editingDomain, ff);
            editingDomain.getCommandStack().execute(remove3);

前两个命令工作得很好,但第三个没有。我甚至没有添加到命令堆栈,也没有删除任何东西。我做错了什么?

更新:正如我在调试器中看到的,执行方法返回UNEXECUTABLE_COMMAND。

2 个答案:

答案 0 :(得分:1)

仅当RemoveCommand.create(editingDomain, ff)作为容器(即ff)时,才能使用指令ff.eContainer != null。将对象添加到包含incment属性的关系时,EMF会自动设置eContainer

remove3命令无效,因为getField()关系不是包含关系。

答案 1 :(得分:0)

最后我找到了答案:

由于我使用了XSD作为源,因此该模型是从该片段生成的:

<xsd:sequence>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="field" type="fieldElem" />
            <xsd:element name="autofill-field" type="fieldElem" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="fieldset" type="fieldsetElem" />
            <xsd:element name="join-field" type="joinFieldElem"/>
        </xsd:choice>
    </xsd:sequence>

所以FieldsetElem不直接包含FieldElem,而是从适当的FutureMap条目中提取FieldElem。所以正确的代码是:

Command remove = RemoveCommand.create(ed,  ed.getWrapper(fe));