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