Wpf 当任何值不';我不工作

Wpf 当任何值不';我不工作,wpf,mvvm,system.reactive,master-detail,reactiveui,Wpf,Mvvm,System.reactive,Master Detail,Reactiveui,我正在使用WPF和ReactiveUI实现一个典型的master details GUI模式。我想保持主视图模型和细节视图模型彼此分离,而不诉诸于更脆弱和间接的东西,如消息总线。然而,有些东西不起作用 我有两个问题: 为什么WhenAnyValue在下面的“我的代码”中不起作用 问题是什么 在中实现解耦主细节的推荐方法 现在有反应吗 代码: 公共类ShellViewModel:ReactiveObject { 公共ShellViewModel(OrderListViewModel OrderLi

我正在使用WPF和ReactiveUI实现一个典型的master details GUI模式。我想保持主视图模型和细节视图模型彼此分离,而不诉诸于更脆弱和间接的东西,如消息总线。然而,有些东西不起作用

我有两个问题:

  • 为什么
    WhenAnyValue
    在下面的“我的代码”中不起作用
  • 问题是什么 在中实现解耦主细节的推荐方法 现在有反应吗
  • 代码:

    公共类ShellViewModel:ReactiveObject
    {
    公共ShellViewModel(OrderListViewModel OrderListViewModel、OrderDetailsViewModel OrderDetailsViewModel)
    {
    OrderListViewModel=OrderListViewModel;
    OrderDetailsViewModel=OrderDetailsViewModel;
    此.whenyValue(x=>x.OrderListViewModel.SelectedOrderHeader.Do(h=>
    {
    OrderDetailsViewModel.Set(h);
    });
    }
    public OrderListViewModel OrderListViewModel{get;}
    public OrderDetailsViewModel OrderDetailsViewModel{get;}
    }
    
    我省略了两个基本的视图模型和相关视图,因为它们非常典型(可观察列表+选定项属性),而且它们本身似乎工作得很好

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

    为什么WhenyValue在下面的代码中不起作用

    因为Rx观测值(比如当任何值时从
    返回的观测值)本质上是惰性的。这意味着,除非您对它们调用
    Subscribe
    ,否则不会发生任何事情。正如你所说的

    #1可以通过使用Subscribe而不是Do来“修复”。我不知道后者的目的是什么

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

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

    现在,在ReactiveUI中实现解耦主细节的推荐方法是什么

    我觉得你的代码很好。我想到的另一种方法是直接从
    OrderListViewModel
    中公开
    IObservable


    哦,除此之外,你还应该考虑在你的<代码> SeLView模型类中喂养这些视图模型。在OrderListViewModel.SelectedOrderHeader?@tagaPdyk谢谢,但这不是问题所在,我已经用我的最新发现更新了问题。感谢您的全面回答!