2016-03-20 11 views
1

ReactiveList ve ItemsAdded özelliği ile ilgili. Bir ReactiveList saklanan Dergisi öğelerin bir listesi vardı:ReactiveLIst Öğeleri Değiştirildi

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

Ve bütün Dergisi Öğeler Denge görüntülemek için bir Readonly özelliği vardır: ViewModel arasında Oluşturucu olarak

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

, ben ReactiveList örneğini ve set 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); 

Sonra yine yapıcı değil daha aşağı, ben ReactiveList öğe eklemek:

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

Ancak bu, Balance özelliğini ayarlamaz ve nedenini bilmiyorum. Ben normal gözlemlenebilir ol' için özelliğini değiştirmek Ancak: yapıcı

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

Ve, ItemsAdded gözlemlenebilir abone olun: Ben günlük öğelerini eklediğinizde

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

, istenen sonucu elde etti. İlk yöntemin neden işe yaramayacağını anlayabileceğimden daha yetenekli birini umut ediyordum. Bunun farkında olmamak için çalışmanın bir yolu var mı?

cevap

2

Büyük olasılıkla keşfettiğiniz tembel bir aboneliktir. ObservableAsPropertyHelper, Value ilk kez erişilinceye kadar gözlemlenebilir kaynağa abone değil - bu bir performans/bellek optimizasyonu.

Muhtemelen inşaat sırasında buna erişiminiz olmadığından, özellik eklendiğinde özellik eklenir. Balance mülkünüze bildirerek öğeyi eklemeye arasına erişirseniz, özellik ayarlanmalıdır.

Genellikle bunun için yaklaşım, örneğin abonelik bir başlangıç ​​değeri üretecek gözlemlenebilir sağlamaktır: Cevabınız Charles için

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

sayesinde ve tam olarak doğru olduğunu, bu Tembel Abonelik neden oldu konu. Metodunu denedim, ama yine de değişkeni yüklemiyordu, fakat ToProperty çağrısından sonra 'Balance' özelliğine bir çağrı yaptığımda, ancak tüm Journal Items'ı yüklemeden önce, beklendiği gibi gerçekleştirildi. Mülkiyet çağrısını yapmaktan kaçınmanın bir yolunu düşünebilir misin? Bu noktada gerçekten merak ediyorum. Dinlemeye başlamak için bir sebep olmaksızın mülkiyeti aramak zorunda kalmak gibi bir hack gibi görünüyor. –

+1

Yöntemimi çok basit bir uygulamada denedim, sonra bazı öğeleri ekledim, daha sonra 'Balans'ı işaretledim ve toplam doğruydu. StartWith'i dahil ettiğinize emin misiniz? –

İlgili konular