简短版本:
我有两个集合:IEnumerable
和ObservableCollection
。我需要一种让它们保持同步的方法。这意味着,如果在一个项目中添加,删除或更新了任何项目,那么该项目将仅在另一个项目中自动添加,删除或更新。怎么办呢?
长版:
我正在使用Entity Framework
WPF
。由于我使用MVVM
实现存储库模式,ViewModel
只获得IEnumerable
个实体。我需要将它们转换为ObservableCollection
而不会失去change tracking
提供的Entity Framework
的能力。
我在网上搜寻解决方案但是徒劳无功。有没有办法正确地做到这一点?
答案 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
,那么更改通知的责任必须向上移动到维护集合的任何级别。