使用比原始元素更多的元素创建ReactiveUI派生集合
是否可以创建一个ReactiveUI派生集合,其中包含的元素多于原始集合?
我已经看到有一种过滤集合和选择单个属性的方法,但我正在寻找的是相当于枚举的SelectMany操作。
为了说明这一点,想象一下,试图得到一个派生的集合来代表每个遇到堵车的乘客。
class Car { ReactiveCollection Passengers; } var TrafficJam=new ReactiveCollection(); EveryPassengerInTheTrafficJam=Cars.CreateDerivedCollection(c=>c.Passengers);
以上不起作用,我认为错误是IEnumerable<ReactiveCollection>
无法强制转换为ReactiveCollection
– 或者任何类型的东西,无论如何。
我无法弄清楚这种扁平化的正确方法 – 诚然,我可能在这里完全错误地吠叫,所以如果有更好的方法来实现同样的事情,请告诉我!
目前, CreateDerivedCollection
不支持SelectMany
作为转换,它处理过于棘手而无法处理。 如果您没有多个项目,则每次都可以重新生成集合:
cars.Changed .Select(_ => cars.SelectMany(x => x.Passengers).ToList()) .ToProperty(this, x => x.Passengers);
编辑:好的,我们走了:
var whenCarsOrPassengersInThoseCarsChange = Observable.Merge( cars.Changed .SelectMany(_ => cars.Select(x => x.Passengers.Changed).Merge()) .Select(_ => Unit.Default), cars.Changed.Select(_ => Unit.Default)); whenCarsOrPassengersInThoseCarsChange.StartWith(Unit.Default) .Select(_ => cars.SelectMany(x => x.Passengers).ToList()) .ToProperty(this, x => x.Passengers);
因此,我们的想法是,当我们想要重新评估乘客名单时,我们有两个主要情况:
- 当其中一名乘客换上车时
- 当其中一辆车改变时
然而,棘手的部分是, 我们只想在集合中观察乘客的汽车 (即如果汽车被拆除,我们不再关心其乘客)。
正确跟踪自杀乘客
因此,奇怪的SelectMany的想法是,“每次汽车列表更改时,构建一个新的Observable列表,表示乘客收集何时更改,并将它们合并在一起”。
然而,如果我们只有这个声明,我们将不得不等待一辆车被添加并且其乘客在我们获得新乘客名单之前改变,所以我们还必须在车辆列表也改变时更新。
什么是“单位”业务?
在这种情况下,我实际上并不关心这些Observable所发布的值,就在它们发生时。 “Unit”是void的Rx版本,它只有一个值“Unit.Default”。 当你只关心事情发生时,你使用它,而不是它的价值。
嗯……我对ReactiveUI并不熟悉,但只是通过阅读,看起来你需要改变你的SelectMany
去的地方:
var jam = cars.SelectMany(x => x.Passengers).CreateDerivedCollection(p => p);