2016-08-17 72 views
0

我正在構建一個Data類的應用程序,用於存儲我的所有數據。在這個類中,我有一個充滿對象的列表。我有一個ObservableCollection和ListView的頁面。目前,當我更新ObservableCollection時,我將其清除並用Data-class列表中的所有數據重新填充。當我這樣做時,我的ListView閃爍。我的猜測是,完全重建ObservableCollection會導致這種情況,並結合使用不是最輕的自定義ViewCell。我怎麼能只更新我想要的? list/o.collection可以有不同的大小。 list/o.collection都存儲同一個對象。如何使用列表更新ObservableCollection並僅更新已更改的值?

我的嘗試:

List<csharp.Truck> favs = data.getFavoriteTrucks(); 
trucks.Clear(); 
foreach (csharp.Truck truck in favs) 
    { 
     trucks.Add(truck); 
    } 
} 

作品,但讓我的ListView閃爍。

現在嘗試這個,它的代碼非常糟糕,我認爲它確實更新了我想要的列表,但是listview並沒有因爲某些原因而得到更新。也許我需要觸發刷新?

List<csharp.Truck> all = data.getTrucks(); 
//if list sizes are not equal(excess/missing objects) 
if (all.Count != trucks.Count) 
{ 
    //excess object 
    if (all.Count < trucks.Count) 
    { 
     trucks.Clear(); 
     foreach(csharp.Truck t in all) 
     { 
      trucks.Add(t); 
     } 
    } 
    //object missing 
    if(all.Count > trucks.Count) 
    { 
     foreach(csharp.Truck t in all) 
     { 
      if (!trucks.Contains(t)) 
      { 
       trucks.Add(t); 
      } 
     } 
    } 
}//objects are now the same 

//test if object is present but outdated(favorite property) 
foreach(csharp.Truck t in trucks) 
{ 
    if (t.isFavorite() != all[all.IndexOf(t)].isFavorite()) 
    { 
     t.setFavorite(all[all.IndexOf(t)].isFavorite()); 
    } 
} 

此外,讓我知道這種方法是不是良好的做法在第一位。

+0

請張貼到目前爲止,你已經嘗試了一些代碼,使人們可以在右鍵點你方向。 –

+0

添加示例。 – wasted

回答

1

如果您只想更新一些屬性,您可以在您的模型類INotifyPropertyChanged界面中實現。

public class Model : INotifyPropertyChanged 
{ 
    private string _myProperty; 
    public string MyProperty 
    { 
     get { return _myProperty; } 
     set 
     { 
      _myProperty = value; 
      RaisePropertyChanged(); 
     } 
    } 

    #region INotifyPropertyChanged implementation 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged([CallerMemberName]string propertyName = "") 
    { 
     Volatile.Read(ref PropertyChanged)?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 
} 

然後,如果這個屬性被綁定到視圖,視圖會知道,當你改變它:

<Label Text="{Binding MyProperty}" />

+0

這比我能理解的更多,但是謝謝你的回答。 – wasted

+0

_如何更新我想要的?_ - 你想要更新的是什麼? –

+0

我想更新一個observablecollection,使其具有與另一個類的列表相同的對象(及其值)。但我只想更新或更改與列表不同的對象,因爲我懷疑清理並讀取所有對象會導致我的列表視圖閃爍。 – wasted

相關問題