【发布时间】:2015-10-10 11:47:34
【问题描述】:
我的 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 扩展不是应该订阅Select(_ => false) 正在返回的IOberservable<bool> 吗?
我仍在掌握这一切的窍门,所以我可能缺少一些明显的东西。
【问题讨论】:
-
在我看来 HasExecuted observable 永远是假的。你也不能设置它,因为它是只读的。
-
嗯,
HasExecuted之前设置为 true,这就是使面板首先展开的原因。而只读成员是ObservableAsPropertyHelper<bool>,而不是布尔本身?
标签: c# mvvm system.reactive reactiveui