ObservableCollection比ObjectSet更好
为什么将ListBox
绑定到在ObjectSet
(来自entity framework)上创建的ObservableCollection
而不是直接绑定到ObjectSet
更好(在WPF,C#,Entity Framework中)?
还有一个问题:当我将ListBox
绑定到ObservableCollection
,集合的任何添加都会更新ListBox
。 大。 但ObservableCollection
是在ObjectContext
(在Entity Framework中)创建的,并且向集合添加新项目不会将项目添加到上下文…如何解决这个问题????
ObservableCollection实现了INotifyPropertyChanged
以及INotifyCollectionChanged
,两者都使用WPF将元素重新绑定到UI。 因此,您可以向ObservableCollection添加一个项目,并立即更新UI,而不会与您进行代码交互。 ObjectSet
既不实现,也不实现此function。
(请注意“另外一个问题”)
Entity Framework 4.1提供了一个新function,它在WPF应用程序中特别有用 – 对象上下文的本地视图 。 它可以通过DbSet
的Local
属性获得。 Local
返回一个ObservableCollection
其中包含当前附加到上下文(而不是处于Deleted
状态)的所有T
类型的实体。
Local
很有用,因为它会自动与对象上下文保持同步。 例如:您可以运行查询以将对象加载到上下文中…
dbContext.Customers.Where(c => c.Country == "Alice's Wonderland").Load();
…然后将上下文中的对象公开为ObservableCollection
…
ObservableCollection items = dbContext.Customers.Local;
…并将其用作某些WPF ItemsControl的ItemsSource
。 在此集合中添加或删除对象时…
items.Add(newCustomer); items.Remove(oldCustomer);
…它们会自动添加到EF环境中/从中删除。 调用SaveChanges
会在数据库中插入/删除对象。
同样在上下文中添加或删除对象……
dbContext.Customers.Add(newCustomer); dbContext.Customers.Remove(oldCustomer);
…自动更新Local
集合,并因此触发WPF绑定引擎更新UI的通知。
以下是有关EF 4.1中Local
的概述。