2012-02-10 61 views
0

我潛入EMF現在,並遇到了以下問題:EMF編輯域命令生成

我試圖刪除字段集場使用下面的代碼:

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。

回答

1

僅當ff作爲容器(即ff.eContainer != null)時,才能使用RemoveCommand.create(editingDomain, ff)指令。當您將對象添加到包含屬性的關係時,EMF自動設置eContainer

remove3命令不能正常工作,因爲getField()關係不是包含關係。

+0

非常感謝! eContainer == null,就像你預測的那樣。如何解決它?它與模型設置有關嗎?我已經從XSD架構生成了我的模型,除了最大/最小元素外,沒有多少改變。 – execc 2012-02-10 10:29:36

+1

@execc:我不知道XSD是如何運作的。如果您有.ecore文件,則可以在選擇關係時在屬性視圖中設置包容。請注意,激活遏制時,EMF的行爲會發生變化,因爲對象只能有一個容器:因此,如果將對象添加到遏制列表中,並且此對象已位於遏制列表中,則EMF會靜默移除對象從之前的名單。它可能很難調試。 – Baldrick 2012-02-10 10:39:55

+0

這裏是我對模型的設置:https://lh4.googleusercontent.com/-1aIvcp-aJHs/TzT22CtrhDI/AAAAAAAAAAc/6GZhtwlSfBk/s963/containment.JPG,它看起來像字段與fieldset有遏制關係。怎麼了? – execc 2012-02-10 10:54:39

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,而不是FieldElem從適當的FutureMap條目中刪除。所以正確的代碼是:

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