ReactiveUI - 为什么简单 ReactiveList.Changed -> ToProperty 不起作用?
ReactiveUI - why is simple ReactiveList.Changed -> ToProperty not working?
我尝试了许多不同的修改,但没有任何帮助。当我深入研究资源时,它是一堆涉及静态的深层魔法,如 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)
好的,我不知道为什么还有其他重载,但这个有效:
private ObservableAsPropertyHelper<decimal> _sum;
...
.ToProperty(this, x => x.Sum, out _sum));
public decimal Sum => _sum.Value;
您的方法(在问题中)的问题是您没有使用 .ToProperty()
调用的返回值,即 ObservableAsPropertyHelper
class。返回值将被忽略。
RxUI 在围绕属性编写代码时实际上很简单。它们只是一个样板,您永远不应该对其进行重大修改。在您的情况下,您想使用 输出 属性 模式,如 here in the docs 所述。适应你的例子,你不需要 setter 和 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
字段的输出引用,您可以使用它(就像在您的回答中一样)。最后,你选择的重载是style/taste的事情。下面的代码与上面的代码完全相同:
// in constructor, alternatively
_list
.Changed
.Select(_ => _list.Select(i => i.Value).Sum())
.ToProperty(this, x => x.Sum, out _sum);
我尝试了许多不同的修改,但没有任何帮助。当我深入研究资源时,它是一堆涉及静态的深层魔法,如 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)
好的,我不知道为什么还有其他重载,但这个有效:
private ObservableAsPropertyHelper<decimal> _sum;
...
.ToProperty(this, x => x.Sum, out _sum));
public decimal Sum => _sum.Value;
您的方法(在问题中)的问题是您没有使用 .ToProperty()
调用的返回值,即 ObservableAsPropertyHelper
class。返回值将被忽略。
RxUI 在围绕属性编写代码时实际上很简单。它们只是一个样板,您永远不应该对其进行重大修改。在您的情况下,您想使用 输出 属性 模式,如 here in the docs 所述。适应你的例子,你不需要 setter 和 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
字段的输出引用,您可以使用它(就像在您的回答中一样)。最后,你选择的重载是style/taste的事情。下面的代码与上面的代码完全相同:
// in constructor, alternatively
_list
.Changed
.Select(_ => _list.Select(i => i.Value).Sum())
.ToProperty(this, x => x.Sum, out _sum);