ReactiveUI:R / W属性与输出属性

时间:2015-10-10 11:47:34

标签: c# mvvm system.reactive reactiveui

我的MVVM视图中有一个“关闭”按钮和一个Expander,如下所示:

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扩展名不应该订阅IOberservable<bool>正在返回的Select(_ => false)吗?

我仍处于掌握所有这一切的中间,所以可能有一些显而易见的东西我不知道。

1 个答案:

答案 0 :(得分:1)

输出属性旨在反映其他属性或可观察对象的状态。它基本上是你编写的一个小公式,它将属性作为输出。你并不打算直接设置它们。请参阅the docs for this

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

^这就是&#34;无论它作为输出提供什么CloseResults,都返回一个始终返回false的Observable&#34;

CloseResults.Select(_ =&gt; false)。 ToProperty(此,vm =&gt; vm.HasExecuted,out _hasExecuted);

^这就是说&#34;把那个永远是假的Observable并把它变成HasExecuted输出属性。&#34;

您的读/写属性更适合您在此处尝试的内容。