2016-03-20 9 views
1

ReactiveListおよびItemsAddedプロパティについて。ReactiveLIst ItemsAdded

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

そして、私はすべてのジャーナル項目のバランスを表示するためのReadOnlyプロパティを持っている:私はReactiveListに格納されたジャーナル項目のリストを持っていた

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プロパティを設定しないため、理由はわかりません。

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

そして、コンストラクタで、ItemsAdded観測登録::私は定期的に老いた観察可能にプロパティを変更する場合は

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

私はジャーナル項目を追加すると、所望の結果があります達成された。最初の方法がうまくいかない理由について私が尋ねるより熟練した人が欲しいと願っていました。私が気付いていないようにする方法はありますか?

答えて

2

あなたが見つけた可能性があるのは、レイジー加入です。 ObservableAsPropertyHelperは、初めてアクセスするまでValueにアクセスするまで観測可能なソースには加入しません。これは、パフォーマンス/メモリの最適化です。

建設中にアクセスしていない可能性が高いので、物件の追加は、プロパティの購読時には見逃されています。 Balanceプロパティにアクセスして宣言してから項目を追加するまでの間は、プロパティを設定する必要があります。

は、一般的に、このためのアプローチは、例えば、サブスクリプションの初期値を生成します、観察を確保することである:ご返信チャールズため

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

おかげで、あなたは正確に正しかった、それは怠惰な契約が原因でした問題。あなたのメソッドを試しましたが、それでも変数はロードされませんでしたが、ToPropertyコールの後で、すべてのジャーナルアイテムをロードする前にプロパティ 'Balance'を呼び出すと、期待どおりに実行されました。あなたはプロパティ呼び出しをしなくてもいい方法を考えていますか?この時点で本当に好奇心が強い。リスニングを開始する以外の理由がなくても、プロパティを呼び出す必要があるようなハックのようなものです。 –

+1

私は非常に基本的なアプリで自分のメソッドを試してから、いくつかの項目を追加してから、「残高」をチェックして合計が正しいとしました。あなたは 'StartWith'を含んでいますか? –

関連する問題