通过 WhenAnyValue 使用 ReactiveUI 的主细节对我不起作用

Master-details using ReactiveUI via WhenAnyValue doesn't work for me

我正在使用 WPF 和 ReactiveUI 实现典型的主从 GUI 模式。我想让主视图模型和细节视图模型彼此分离,而不求助于消息总线等更脆弱和间接的东西。但是有些东西不起作用。

我有两个问题:

  1. 为什么 WhenAnyValue 在我下面的代码中不起作用?
  2. 什么是 在中实现解耦主细节的推荐方法 现在的 ReactiveUI?

代码:

public class ShellViewModel : ReactiveObject
{
    public ShellViewModel(OrderListViewModel orderListViewModel, OrderDetailsViewModel orderDetailsViewModel)
    {
        OrderListViewModel = orderListViewModel;
        OrderDetailsViewModel = orderDetailsViewModel;

        this.WhenAnyValue(x => x.OrderListViewModel.SelectedOrderHeader).Do(h =>
        {
            OrderDetailsViewModel.Set(h);
        });
    }

    public OrderListViewModel OrderListViewModel { get; }
    public OrderDetailsViewModel OrderDetailsViewModel { get; }
}

我省略了两个底层视图模型和相关视图,因为它们非常典型(可观察列表 + 选定项 属性)并且似乎自己工作正常。

更新: #1 可以 "fixed" 通过使用 Subscribe 而不是 Do。不知道后者的目的是什么?

Why is WhenAnyValue not working in my code below?

因为 Rx observables(比如从您的 WhenAnyValue 返回的那个)本质上是惰性的。这意味着,在您对它们调用 Subscribe 之前,什么都不会发生。正如您所说...

the the #1 can be "fixed" by using Subscribe instead of Do. I don't know what is the purpose of the latter?

它的目的是为您的 Rx 流引入副作用。例如,您可以在此方法中注入一些日志记录。

this.WhenAnyValue(x => x.OrderListViewModel.SelectedOrderHeader)
    .Do(_ => Console.WriteLine("Order selected!")
    .Subscribe(h => OrderDetailsViewModel = h);

注意 introducing side effects in Rx should generally be avoided.

What is the recommended way of implementing decoupled master-details in ReactiveUI nowadays?

我觉得你的代码没问题。我想到的替代方法是直接从 OrderListViewModel.

公开 IObservable<OrderDetailsViewModel>

哦,除此之外,您绝对应该考虑将这些视图模型提供给 ShellViewModel class.

中的 ObservableAsPropertyHelper