2

我有一个具有以下结构的模型(在 Xcore 中指定):

class Network {
    contains Master[] masters
}

class Master {
    contains Slave[] slaves
}

class Slave {}

我想使用 EMF 数据绑定来创建网络中所有主机中所有从属对象的可观察列表。

如何才能做到这一点?

或者:我可以创建一个可观察的奴隶列表的可观察列表吗?即,类型为 的结构IObservableList<IObservableList<Slave>>


例如,以下内容不起作用:

Network network = ... 

IObservableList allSlaves = EMFProperties
    .list(Literals.NETWORK__MASTERS)
    .values(Literals.MASTER__SLAVES)
    .observe(network);

结果列表似乎是类型IObservableList<EList<Slave>>而不是所需类型。问题是结果IObservableList具有类的元素EObjectContainmentEList,而不是IObservableList.

4

1 回答 1

0

事实证明,有一种方法可以创建嵌套的可观察列表,不仅适用于 EMF 列表功能,还适用于所有类型的可观察列表。

诀窍是将该MasterDetailObservables.detailValues方法与返回可观察列表的工厂一起使用。

Network network = TryingFactory.eINSTANCE.createNetwork();
network.getMasters().add(TryingFactory.eINSTANCE.createMaster());
network.getMasters().add(TryingFactory.eINSTANCE.createMaster());
network.getMasters().get(0).getSlaves().add(TryingFactory.eINSTANCE.createSlave());
network.getMasters().get(1).getSlaves().add(TryingFactory.eINSTANCE.createSlave());
network.getMasters().get(1).getSlaves().add(TryingFactory.eINSTANCE.createSlave());

IObservableList<Master> masterList = EMFProperties.list(Literals.NETWORK__MASTERS).observe(network);

IObservableList<IObservableList<Slave>> nestedLists = MasterDetailObservables.detailValues(masterList,
        master -> Observables.constantObservableValue(masterList.getRealm(), 
                EMFProperties.list(Literals.MASTER__SLAVES).observe(master),
                IObservableList.class),
        IObservableList.class);

// Dispose nested lists when they are removed from the top-level list 
nestedLists.addListChangeListener(event -> event.diff.accept(new ListDiffVisitor<IObservableList<?>>() {
    @Override
    public void handleRemove(int index, IObservableList<?> element) {
        element.dispose();
    }

    @Override public void handleAdd(int index, IObservableList<?> element) {}
    @Override public void handleMove(int oldIndex, int newIndex, IObservableList<?> element) {}
}));

nestedLists.forEach(System.out::println);
// Prints:
// [trying.impl.SlaveImpl@7692d9cc]
// [trying.impl.SlaveImpl@75f32542, trying.impl.SlaveImpl@7f1302d6]
于 2019-06-04T19:57:16.123 回答