为什么更好(在WPF,C#,实体框架中)将ListBox
绑定到在ObservableCollection
(来自实体框架)上创建的ObjectSet
,而不是绑定到{{1直接?
还有一个问题:
当我将ObjectSet
绑定到ListBox
时,对集合的任何添加都会更新ObservableCollection
。大。但是ListBox
是在ObservableCollection
(在实体框架中)创建的,并且向集合添加新项目不会将项目添加到上下文...如何解决此问题????
答案 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
既不实现,也不实现此功能。