保持IEnumerable和ObservableCollection同步

时间:2017-03-15 00:41:30

标签: c# wpf entity-framework mvvm repository-pattern

简短版本:

我有两个集合:IEnumerableObservableCollection。我需要一种让它们保持同步的方法。这意味着,如果在一个项目中添加,删除或更新了任何项目,那么该项目将仅在另一个项目中自动添加,删除或更新。怎么办呢?

长版: 我正在使用Entity Framework WPF。由于我使用MVVM实现存储库模式,ViewModel只获得IEnumerable个实体。我需要将它们转换为ObservableCollection而不会失去change tracking提供的Entity Framework的能力。

我在网上搜寻解决方案但是徒劳无功。有没有办法正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

在一般情况下,问题没有一般解决方案。

那就是说。您没有使用IEnumerable。您正在使用DbSet<T>,这会公开public ObservableCollection<T> Local { get; }。解。不要同步两个集合。只需使用正确的集合即可。

编辑问题:

我会重构你的代码,以便&#34;存储库&#34;是收藏品。

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();
    }
}

答案 1 :(得分:2)

跟踪ObservableCollection变化是微不足道的;该类 - 更具体地说,它实现的接口 - 具有您可以订阅的CollectionChanged事件。有关此事件及其事件参数的信息,请参阅MSDN

根据定义,IEnumerable只是一个可以枚举的集合。它没有相应的变化&#34;概念,因为除了循环/过滤它之外没有任何业务。如果您遇到IEnumerable,那么更改通知的责任必须向上移动到维护集合的任何级别。