我现在正在深入研究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。
答案 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));