ObservableCollection比ObjectSet更好

时间:2011-05-31 21:12:40

标签: c# .net wpf entity-framework data-binding

为什么更好(在WPF,C#,实体框架中)将ListBox绑定到在ObservableCollection(来自实体框架)上创建的ObjectSet,而不是绑定到{{1直接?

还有一个问题: 当我将ObjectSet绑定到ListBox时,对集合的任何添加都会更新ObservableCollection。大。但是ListBox是在ObservableCollection(在实体框架中)创建的,并且向集合添加新项目不会将项目添加到上下文...如何解决此问题????

2 个答案:

答案 0 :(得分:15)

(请注意“另外一个问题”)

Entity Framework 4.1提供了一项新功能,该功能在WPF应用程序中特别有用 - 对象上下文的本地视图。它可以通过Local的{​​{1}}属性获得。 DbSet<T>会返回Local,其中包含当前附加到上下文(而不是状态ObservableCollection<T>)的T类型的所有实体。

Deleted非常有用,因为它会自动与对象上下文保持同步。例如:您可以运行查询以将对象加载到上下文中......

Local

...然后将上下文中的对象公开为dbContext.Customers.Where(c => c.Country == "Alice's Wonderland").Load(); ...

ObservableCollection

...并将其用作某些WPF ItemsControl的ObservableCollection<Customer> items = dbContext.Customers.Local; 。在此集合中添加或删除对象时......

ItemsSource

...它们会自动添加到EF环境中/从中删除。调用items.Add(newCustomer); items.Remove(oldCustomer); 会在数据库中插入/删除对象。

同样在上下文中添加或删除对象......

SaveChanges

...自动更新dbContext.Customers.Add(newCustomer); dbContext.Customers.Remove(oldCustomer); 集合,并因此触发WPF绑定引擎的通知以更新UI。

Here概述了EF 4.1中的Local

答案 1 :(得分:6)

ObservableCollection实现INotifyPropertyChanged以及INotifyCollectionChanged,两者都是WPF用于将元素重新绑定到UI的。因此,您可以向ObservableCollection添加一个项目,并立即更新UI,而不会与您进行代码交互。 ObjectSet既不实现,也不实现此功能。