【问题标题】:Master-details using ReactiveUI via WhenAnyValue doesn't work for me通过 WhenAnyValue 使用 ReactiveUI 的主详细信息对我不起作用
【发布时间】:2015-11-09 11:08:20
【问题描述】:

我正在使用 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 可以通过使用Subscribe 而不是Do 来“修复”。不知道后者的目的是什么?

【问题讨论】:

  • OrderListViewModel.SelectedOrderHeader 中有你的 RaiseAndSet.. 吗?
  • @tagaPdyk 谢谢,但这不是问题,我已经用我的最新发现更新了这个问题。

标签: wpf mvvm system.reactive master-detail reactiveui


【解决方案1】:

为什么WhenAnyValue 在我下面的代码中不起作用?

因为 Rx 可观察对象(例如从您的 WhenAnyValue 返回的对象)本质上是懒惰的。这意味着,除非您对它们调用 Subscribe,否则不会发生任何事情。正如你所说...

#1 可以通过使用订阅而不是执行来“修复”。不知道后者的目的是什么?

其目的是为您的 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

如今在 ReactiveUI 中实现解耦的主从细节的推荐方式是什么?

您的代码对我来说看起来不错。我想到的另一种方法是直接从OrderListViewModel 公开IObservable<OrderDetailsViewModel>

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

【讨论】:

  • 感谢您的详尽解答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多