ReactiveLIst ItemsAdded

时间:2016-03-20 19:09:58

标签: c# reactiveui

关于ReactiveList和ItemsAdded属性。我有一个存储在ReactiveList中的Journal项目列表:

public ReactiveList<account.JournalViewModel> JournalEntries { get; private set; }

我有一个Readonly属性来显示所有期刊项目的余额:

readonly ObservableAsPropertyHelper<decimal> _balance;
public decimal Balance { get { return _balance.Value; } }

在ViewModel的构造函数中,我实例化ReactiveList,并设置ObservableAsPropertyHelper:

this.JournalEntries = new ReactiveList<account.JournalViewModel>();
this.JournalEntries.ChangeTrackingEnabled = true;
this.WhenAnyObservable(vm => vm.JournalEntries.ItemsAdded)
    .Select(_ => this.JournalEntries.Sum(j => j.CreditAmount) - this.JournalEntries.Sum(j => j.DebitAmount))
    .ToProperty(this, vm => vm.Balance, out _balance);

然后,仍然在构造函数中但是进一步向下,我将项添加到ReactiveList:

foreach (var j in journalEntries)
     this.JournalEntries.Add(new account.JournalViewModel(j, this));

但是这并没有设置Balance属性,我也不知道为什么。但是,如果我将该属性更改为常规ol&#39;可观察到:

decimal _balance;
public decimal Balance { get { return _balance; } set { this.RaiseAndSetIfChanged(ref _balance, value); } }

并且,在构造函数中,订阅ItemsAdded Observable:

this.WhenAnyObservable(vm => vm.JournalEntries.ItemsAdded)
    .Subscribe(_ => this.Balance = this.JournalEntries.Sum(j => j.CreditAmount) - this.JournalEntries.Sum(j => j.DebitAmount));

当我添加日记项目时,实现了所需的结果。我希望有一个比我更熟练的人可以回答为什么第一种方法不会起作用。有没有办法使它成为我不知道的工作?

1 个答案:

答案 0 :(得分:2)

您可能发现的是懒惰订阅。 ObservableAsPropertyHelper在第一次访问Value之前不会订阅源可观察对象 - 这是性能/内存优化。

由于您在施工期间可能无法访问此项,因此在物业订阅时将遗漏项目的添加。如果您在声明它和添加项目之间访问Balance属性,则应设置该属性。

通常,这种方法是确保observable将在订阅时产生初始值,例如:

JournalEntries.ItemsAdded.Select(_ => Unit.Default)
     .StartWith(Unit.Default)
     .Select(_ => JournalEntries.Sum(x => x.CreditAmount - x.DebitAmount))
     .ToProperty(this, x => x.Balance, out _balance);