【问题标题】:Nested observable list from EObjects contents来自 EObjects 内容的嵌套可观察列表
【发布时间】:2017-08-13 17:59:48
【问题描述】:

我有一个具有以下结构的模型(在 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

【问题讨论】:

    标签: data-binding eclipse-emf emf eclipse-databinding


    【解决方案1】:

    事实证明,有一种方法可以创建嵌套的可观察列表,不仅适用于 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多