【问题标题】:ReactiveUI - why is simple ReactiveList.Changed -> ToProperty not working?ReactiveUI - 为什么简单的 ReactiveList.Changed -> ToProperty 不起作用?
【发布时间】:2016-06-14 12:37:12
【问题描述】:

我尝试了许多不同的修改,但没有任何帮助。当我深入研究源代码时,这是一堆涉及静态的深层魔法,例如 ConditionalWeakTable 等。

private readonly ReactiveList<Item> _list = new ReactiveList<Item>();

private decimal _sum;
public decimal Sum
{
    get { return _sum; }
    set { this.RaiseAndSetIfChanged(ref _sum, value); }
}

_list
    .Changed
    .Select(_ => _list.Select(i => i.Value).Sum())
    .ToProperty(this, x => x.Sum)

【问题讨论】:

    标签: c# mvvm system.reactive observable reactiveui


    【解决方案1】:

    您的方法(在问题中)的问题是您没有使用来自.ToProperty() 调用的返回值,即ObservableAsPropertyHelper 类。返回的值被简单地忽略。

    当涉及到围绕属性的代码时,RxUI 实际上很简单。它们只是一个样板,您永远不应该对其进行重大修改。在您的情况下,您想使用 输出属性 模式,描述为here in the docs。适应您的示例,您不需要带有RaiseAndSetIfChanged 的设置器。相反,你应该使用这样的东西:

    private readonly ReactiveList<Item> _list = new ReactiveList<Item>();
    
    private readonly ObservableAsPropertyHelper<decimal> _sum;
    public decimal Sum {
        get { return _sum.Value; }
    }
    
    // in constructor
    _sum = _list
        .Changed
        .Select(_ => _list.Select(i => i.Value).Sum())
        .ToProperty(this, x => x.Sum);
    

    正如您已经注意到的,ToProperty 有一个重载,接受对 ViewModel 中 ObservableAsPropertyHelper 字段的输出引用,您可以使用它(就像在您的答案中一样)。最后,您选择的超载是风格/品味的问题。下面的代码和上面的代码完全一样:

    // in constructor, alternatively
    _list
        .Changed
        .Select(_ => _list.Select(i => i.Value).Sum())
        .ToProperty(this, x => x.Sum, out _sum);
    

    【讨论】:

      【解决方案2】:

      好吧,我不知道为什么还有其他重载,但是这个有效:

      private ObservableAsPropertyHelper<decimal> _sum;
      
      ...
      .ToProperty(this, x => x.Sum, out _sum));
      
      
      public decimal Sum => _sum.Value;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-25
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多