2017-08-25 177 views
0

源代碼視圖模型是在這裏: https://github.com/djangojazz/BubbleUpExample更新時可觀察集合中的項目進行更新

的問題是我想要一個視圖模型的一個ObservableCollection調用更新,當我更新項目的屬性那個集合。我可以更新綁定的數據,但保存集合的ViewModel不會更新,UI也不會更新。

public int Amount 
{ 
    get { return _amount; } 
    set 
    { 
    _amount = value; 
    if (FakeRepo.Instance != null) 
    { 
     //The repo updates just fine, I need to somehow bubble this up to the 
     //collection's source that an item changed on it and do the updates there. 
     FakeRepo.Instance.UpdateTotals(); 
     OnPropertyChanged("Trans"); 
    } 
    OnPropertyChanged(nameof(Amount)); 
    } 
} 

基本上,我需要的成員告訴何地它被稱爲集合:「嘿,我更新了你,採取通知,告訴你的一部分父我只是無知冒泡例程或調用爲了達到這個目的,我發現有限的線程與我所做的略有不同,我知道它可以做很多事情,但我沒有運氣。下面的圖片不需要先點擊列。

enter image description here

+0

搜索類似trulyObservableCollection的AddToTrans方法,這裏是一個samle:https://stackoverflow.com/questions/1427471/observablecollection-not-noticing-when-item在它改變,甚至與inotifyprop – sTrenat

回答

1

如果您的基礎項目遵守INotifyPropertyChanged,則可以使用可觀察的集合,這會使屬性更改通知冒泡,如下所示。

public class ItemObservableCollection<T> : ObservableCollection<T> where T : INotifyPropertyChanged 
{ 
    public event EventHandler<ItemPropertyChangedEventArgs<T>> ItemPropertyChanged; 


    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs args) 
    { 
     base.OnCollectionChanged(args); 
     if (args.NewItems != null) 
      foreach (INotifyPropertyChanged item in args.NewItems) 
       item.PropertyChanged += item_PropertyChanged; 

     if (args.OldItems != null) 
      foreach (INotifyPropertyChanged item in args.OldItems) 
       item.PropertyChanged -= item_PropertyChanged; 
    } 

    private void OnItemPropertyChanged(T sender, PropertyChangedEventArgs args) 
    { 
     if (ItemPropertyChanged != null) 
      ItemPropertyChanged(this, new ItemPropertyChangedEventArgs<T>(sender, args.PropertyName)); 
    } 

    private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     OnItemPropertyChanged((T)sender, e); 
    } 
} 
+0

我認爲你是從這個答案缺少ItemPropertyChangedEventArgs的一些代碼:https://stackoverflow.com/questions/3849361/itempropertychanged-not-working-on-observablecollection-why 。一旦你像你說的那樣把它掛上鉤子,這個答案就行得通。謝謝。 – djangojazz

+0

這個答案證明是更好的,因爲一旦它被連接起來,我需要將它應用到一個更大的解決方案中,這個解決方案有更復雜的部分。這一個將掛鉤到OnPropertyChanged的覆蓋,因此我可以把任何我想要的父母。 – djangojazz

1

你應該做兩件事情來得到它的工作:第一 :你應該重構RunningTotal屬性,因此它可以提高屬性更改事件。像這樣:

private int _runningTotal; 
public int RunningTotal 
{ 
    get => _runningTotal; 
    set 
    { 
     if (value == _runningTotal) 
      return; 
     _runningTotal = value; 
     OnPropertyChanged(nameof(RunningTotal)); 
    } 
} 

你應該做的第二件事情是調用UpdateTotals添加一個DummyTransactionTrans後。一種選擇可能是重構的FakeRepo

public void AddToTrans(int id, string desc, int amount) 
{    
    Trans.Add(new DummyTransaction(id, desc, amount)); 
    UpdateTotals(); 
} 
相關問題