2017-03-15 62 views
0

短版:保持一個IEnumerable和一個ObservableCollection同步

我有兩個類別:一IEnumerableObservableCollection。我需要一種方法來保持它們的同步。這意味着,如果任何項目被添加,刪除或更新爲一個,那麼該項目以及該項目將自動添加,刪除或更新。如何才能做到這一點?

長版本: 我使用Entity FrameworkWPF。由於我正在使用MVVM實施存儲庫模式,因此ViewModel僅獲得實體的IEnumerable。我需要他們轉換爲ObservableCollection而不會丟失由Entity Framework提供的change tracking的能力。

我已經在網上尋找解決方案,但徒勞無功。有什麼方法可以正確地做到嗎?

回答

3

在一般情況下,問題沒有一般的解決方案。

這就是說。您沒有使用IEnumerable。您正在使用DbSet<T>,其中顯示public ObservableCollection<T> Local { get; }。解。不要同步兩個集合。只需使用正確的集合就可以開始。

編輯重問題:

我會重構你的代碼,使「資源庫」是Collection。

public class FooRepository 
    : ICollection<Foo> 
    , INotifyCollectionChanged 
{ 
    private BarDbContext _context; 

    public FooRepository() 
    { 
     _context = new BarDbContext(); 
     _context.Foos.Local.CollectionChanged += (o, e) => CollectionChanged(this, e); 
    } 
    //Delegate ICollection to _context.Foos.Local 
    public Foo this[int index] { get { return _context.Foos.Local[index]; } } 

    public Task Load(Expression<Foo, bool> predicate) 
    { 
     return _context.Foos.Where(predicate).LoadAsync(); 
    } 
} 
+0

幼稚的問題在這裏:假設,我做這在我的倉庫: '的IEnumerable FindWhere(表達>謂語) {返回context.Set ()。凡(謂語).ToList(); }' 換句話說,我渴望加載。如果我想使用本地,我應該明確加載使用Load()? –

+0

如果我的存儲庫中只有一個方法,則您的編輯可能已經工作。但是,這只是其中的一部分。我應該如何在這裏處理它? ()); public T(FetchByPrimaryKey(object primarykey) { return _ctx.Set ().Find(primarykey); } 公共的IEnumerable FindWhere(表達式>謂詞) { 返回_ctx.Set ()。凡(謂詞)。ToList(); } 公共ŤFirstOrDefault(表達式>謂詞) { 返回_ctx.Set ()。凡(謂詞).FirstOrDefault(); }' –

2

跟蹤ObservableCollection的變化是微不足道的;該類 - 更具體地說,它實現的接口 - 具有您可以訂閱的CollectionChanged事件。有關此活動及其活動參數的信息,請參閱MSDN

根據定義,IEnumerable只是一個可以列舉的集合。它沒有等同的「改變」概念,因爲除了循環和過濾之外,沒有任何業務。如果您遇到IEnumerable,那麼更改通知的責任必須上升到一個級別,以維護收集。

+1

雖然你寫的所有內容都是正確的。對這個問題的更仔細的閱讀表明'IEnumerable'實際上是EntityFramework。在這種情況下,解決方案很簡單。您只需使用'DbSet .Local'屬性。 – Aron

+0

我明白了!感謝您的澄清。 –