2017-06-15 104 views
0

作为来自Shane Neuville的反应,我改变了我的问题。但是,是的。这可能比我想象的要复杂得多。ReactiveCommand根据两个命令彼此

我有一个ReactiveList<ServiceEntryModel> Services;当视图出现时会被填充。对于列表中的每个条目,我都使用了名为Services.ItemsAdded.Subscribe()的函数,其中RxCell将填充整个列表末尾应以特定方式排序的数据。截至目前,我有两个单独的ReactiveCommands。

1.ReactiveCommand<Unit, List<ServiceEntryModel>> RefreshServices; 

2.ReactiveCommand<Unit, List<ServiceEntryModel>> OrderByCommand; 

从Services.ItemsAdded.Subscribe方法填充整个列表时应该调用第二个命令。我怎样才能检查/知道每个项目完成后?

我已经尝试了一些与计数器和ObservablePropertyHelpers,但没有任何运气,迄今。

下面是应该是相关

Services.ItemsAdded.Subscribe(async entryItem => 
{ 
    ServiceEntityStatusDto serviceEntityStatus = await GetServiceEntryStatus(entryItem); 

    if (serviceEntityStatus != null) 
    { 
     entryItem.AvailabilityStatus = serviceEntityStatus.AvailabilityStatus; 
     entryItem.PerformanceStatus = serviceEntityStatus.PerformanceStatus; 
    } 
    counterServices++; 
    //await OrderServices.Execute(); //TODO infinite loop ? 
}); 

被注释掉的部分是一个无限循环,因为Services.ItemsAdded将继续被称为我的视图模型的一部分。

用户可以拉动刷新,第一个命令将再次被调用,所以正确的时候完成。秒数应该重新排列整个列表。

+0

我还没有完全追随。是否有可能创建一个你想要完成的小样本?对于这个“我怎样才能检查/知道每一个项目完成?”我会问你同样的事情。它的指标是什么?数据到达你知道它完成的地方。你实施了一个柜台,所以你知道物品的数量?如果你只想对列表进行排序,那么https://docs.reactiveui.net/en/user-guide/lists/derived-lists.html可能是更好的解决方案 –

回答

0

这够了吗?

RefreshServices 
    .SelectMany(_ => OrderServices.Execute()) 
    .Subscribe(); 

还是InvokeCommand语法

RefreshServices 
    .InvokeCommand(OrderServices); 

的区别在于与InvokeCommand OrderServices如果它已经在执行这可能不适合你的使用情况将不会执行。例如,当OrderServices仍在运行时,RefreshServices可以再次执行。

+0

谢谢你的回答。我应该在哪里放? –

+0

InvokeCommand是为此设计的 – MistyK

+0

在两个命令都被实例化之后,您可以将它放置在任何地方。我包含了InvokeCommand语法,但我想我对你的用例有点好奇。如果Order Services只是在RefreshServices之后总是被调用的,那么为什么不直接在RefreshServices中创建“DoOrderService”呢?为什么使它成为一个单独的命令当OrderServices运行时,用户可以发出另一个RefreshService?用户是否可以单击OrderService而不运行RefreshService? –