ReactiveUI: R/W属性vs.输出属性

本文关键字:属性 vs 输出 ReactiveUI | 更新日期: 2023-09-27 18:16:58

我有一个"关闭"按钮和一个扩展器链接在我的MVVM视图,像这样:

this.BindCommand(ViewModel, vm => vm.CloseResults, v => v.CloseButton);
this.OneWayBind(ViewModel, vm => vm.HasExecuted, v => v.Panel.IsExpanded);

如果用户单击按钮,展开器应该折叠。在视图模型中,我有一个ReactiveCommand来处理这个问题:

public ReactiveCommand<object> CloseResults { get; protected set; } =
   ReactiveCommand.Create();

在视图模型中,HasExecuted是一个输出属性,它应该根据其值展开/折叠展开器:

private readonly ObservableAsPropertyHelper<bool> _hasExecuted;
public bool HasExecuted => _hasExecuted.Value;

因此,为了将命令与按钮连接起来,我将HasExecuted绑定到命令,如下所示:

CloseResults.Select(_ => false).ToProperty(this, vm => vm.HasExecuted, out _hasExecuted);

这似乎没有任何作用。但是,如果我使用读写属性,并像这样将其连接起来:

CloseResults.Subscribe(_ => { HasExecuted = false; });

效果很好。有人能解释为什么输出属性在这种情况下不起作用吗?难道ToProperty扩展不应该订阅Select(_ => false)返回的IOberservable<bool>吗?

我还在摸索这一切的窍门,所以可能有一些明显的东西我遗漏了。

ReactiveUI: R/W属性vs.输出属性

输出属性旨在反映其他属性或可观察对象的状态。它基本上是你写的一个小公式给出了一个属性作为输出。你不应该直接设置它们。参考文档

CloseResults。选择(_ => false)。ToProperty(this, vm => vm.)

^这是说"不管它给出什么CloseResults作为输出,返回一个总是返回false的Observable"

CloseResults。选择(_ => false)。ToProperty(this, vm => vm。

^这是在说"把那个always-false的Observable转换成HasExecuted输出属性。"

你的read/write属性更适合你在这里要做的。