c# - ReactiveUI - 为什么简单的 ReactiveList.Changed -> ToProperty 不起作用?

标签 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)

最佳答案

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

关于c# - ReactiveUI - 为什么简单的 ReactiveList.Changed -> ToProperty 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37812237/

相关文章:

c# - 检查两个泛型类型是否相等

c# - "() =>"在 C# 中是什么意思?

c# - 执行 ReportProgress 时,BackgroundWorker 或(Dispatcher)操作已完成

wpf - ItemsControl 与其项目源不一致 - 发生在嵌套的 ListView 中

c# - 如何覆盖 PropertyGrid 中 DockStyle 编辑器的行为

c# - 在运行时添加新页面

c# - OO 设计建议 - 需求发生了变化,那么如何重构当前类?

c# - 如何使用 RxNET 发出异步 HTTP 请求?

c# - XAML 中用于绑定(bind)到 ISubject<string> 的标记扩展

c# - 在主线程上观察时是否需要同步可观察对象?