【问题标题】:ReactiveUI: R/W properties vs. Output PropertiesReactiveUI:R/W 属性与输出属性
【发布时间】: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(_ =&gt; false) 正在返回的IOberservable&lt;bool&gt; 吗?

我仍在掌握这一切的窍门,所以我可能缺少一些明显的东西。

【问题讨论】:

  • 在我看来 HasExecuted observable 永远是假的。你也不能设置它,因为它是只读的。
  • 嗯,HasExecuted 之前设置为 true,这就是使面板首先展开的原因。而只读成员是ObservableAsPropertyHelper&lt;bool&gt;,而不是布尔本身?

标签: c# mvvm system.reactive reactiveui


【解决方案1】:

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

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

^ 这就是说“无论它给出什么样的 CloseResults 作为输出,都返回一个始终返回 false 的 Observable”

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

^ 这就是说“将始终为假的 Observable 转换为 HasExecuted 输出属性。”

您的读/写属性更适合您在此处尝试执行的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 2011-08-23
    • 2013-10-15
    • 2011-11-29
    • 2015-08-17
    • 2019-07-23
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多