我尝试了许多不同的修改,但无济于事。当我深入研究源代码时,会发现一堆涉及静态的深层魔力,例如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)

最佳答案

您的方法存在问题(问题中)是您没有使用.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);

09-16 05:18