我有一个"关闭"按钮和一个扩展器链接在我的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>
吗?
我还在摸索这一切的窍门,所以可能有一些明显的东西我遗漏了。
输出属性旨在反映其他属性或可观察对象的状态。它基本上是你写的一个小公式给出了一个属性作为输出。你不应该直接设置它们。参考文档
CloseResults。选择(_ => false)。ToProperty(this, vm => vm.)
^这是说"不管它给出什么CloseResults作为输出,返回一个总是返回false的Observable"
CloseResults。选择(_ => false)。ToProperty(this, vm => vm。
^这是在说"把那个always-false的Observable转换成HasExecuted输出属性。"
你的read/write属性更适合你在这里要做的。