ReactiveUI - 为什么简单的ReactiveList.Changed - > ToProperty不工作?

时间:2016-06-14 12:37:13

标签: c# mvvm system.reactive observable reactiveui

我尝试了很多不同的修改,但没有任何帮助。当我深入研究资料来源时,它是一堆涉及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)

2 个答案:

答案 0 :(得分:7)

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

当涉及到属性的代码时,RxUI实际上很简单。它们只是一个模板,你永远不应该明显修改。在您的情况下,您希望使用输出属性模式,描述为here in the docs。根据您的示例,您不需要使用RaiseAndSetIfChanged的setter。相反,你应该使用这样的东西:

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);

答案 1 :(得分:1)

好的,我不知道为什么地球上还有其他超载,但这个有效:

private ObservableAsPropertyHelper<decimal> _sum;

...
.ToProperty(this, x => x.Sum, out _sum));


public decimal Sum => _sum.Value;