通过 WhenAnyValue 使用 ReactiveUI 的主细节对我不起作用
Master-details using ReactiveUI via WhenAnyValue doesn't work for me
我正在使用 WPF 和 ReactiveUI 实现典型的主从 GUI 模式。我想让主视图模型和细节视图模型彼此分离,而不求助于消息总线等更脆弱和间接的东西。但是有些东西不起作用。
我有两个问题:
- 为什么
WhenAnyValue
在我下面的代码中不起作用?
- 什么是
在中实现解耦主细节的推荐方法
现在的 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
我正在使用 WPF 和 ReactiveUI 实现典型的主从 GUI 模式。我想让主视图模型和细节视图模型彼此分离,而不求助于消息总线等更脆弱和间接的东西。但是有些东西不起作用。
我有两个问题:
- 为什么
WhenAnyValue
在我下面的代码中不起作用? - 什么是 在中实现解耦主细节的推荐方法 现在的 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.