我的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)
吗?
我仍处于掌握所有这一切的中间,所以可能有一些显而易见的东西我不知道。
答案 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;
您的读/写属性更适合您在此处尝试的内容。