ReactiveUI - 为什么简单的ReactiveList.Changed - > ToProperty无效?

Den*_*Den 4 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)
Run Code Online (Sandbox Code Playgroud)

pmb*_*nka 7

您的方法(在问题中)的问题是您没有使用来自.ToProperty()call 的返回值,即ObservableAsPropertyHelperclass.返回的值只是被忽略.

在涉及属性的代码时,RxUI实际上很简单.它们只是一个模板,你永远不应该明显修改.在您的情况下,您希望使用文档中描述的输出属性模式.根据您的示例,您不需要使用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);
Run Code Online (Sandbox Code Playgroud)

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

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