是否可以创建一个ReactiveUI派生集合,其中包含比原始集合更多的元素?
我已经看到有一种过滤集合和选择单个属性的方法,但我要寻找的是与枚举数的SelectMany操作等效的方法。
为了说明这一点,想象一下试图获得一个派生集合,代表在交通堵塞中被困的每个乘客。
class Car
{
ReactiveCollection<Passenger> Passengers;
}
var TrafficJam=new ReactiveCollection<Car>();
EveryPassengerInTheTrafficJam=Cars.CreateDerivedCollection(c=>c.Passengers);
以上不起作用,我认为错误是IEnumerable<ReactiveCollection<Passenger>>
不能转换为ReactiveCollection<Passenger>
-或者在任何情况下与类型有关。
我想不出这个扁平化的正确方法——不可否认,我在这里可能完全找错了对象,所以请告诉我是否有更好的方法来实现同样的事情!
目前,CreateDerivedCollection
不支持SelectMany
作为转换,它变得太棘手,无法处理移除。如果您没有很多项目,您可以每次重新生成集合:
cars.Changed
.Select(_ => cars.SelectMany(x => x.Passengers).ToList())
.ToProperty(this, x => x.Passengers);
Edit:好的,我们开始:
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列表,表示乘客集合发生变化时,并将它们合并在一起"。
然而,如果我们只有有这个语句,我们将不得不等待一辆汽车被添加和的乘客在我们得到新的乘客列表之前发生变化,所以我们也必须在汽车列表也发生变化时进行更新。这个"单位"是什么?
在这种情况下,我实际上并不关心这些可观察对象输出的值,只关心它们何时出现。"Unit"是void的Rx版本,它只有一个值"Unit. default "。当你只关心某件事何时发生,而不关心它的值是多少时,你就可以使用它。
嗯…我不是那么熟悉ReactiveUI,但只是通过阅读,它看起来像你需要改变你的SelectMany
去:
var jam = cars.SelectMany(x => x.Passengers).CreateDerivedCollection(p => p);