ObservableCollection比ObjectSet更好

5
在WPF、C#、Entity Framework中,为什么绑定ListBox到在ObjectSet上创建的ObservableCollection比直接绑定到ObjectSet更好?
还有一个问题: 当我将ListBox绑定到ObservableCollection时,向集合中添加任何内容都会更新ListBox。很好。但ObservableCollection是在ObjectContext(在Entity Framework中)上创建的,向集合中添加新项并不会将该项添加到上下文...如何解决???
2个回答

15
(针对你的“另一个问题”提醒)
Entity Framework 4.1 提供了一项新功能,特别适用于 WPF 应用程序——对象上下文的本地视图。它通过 DbSet 的 Local 属性提供,Local 返回一个 ObservableCollection,其中包含当前附加到上下文中(且不处于“已删除”状态)的所有 T 类型实体。
Local 很有用,因为它会自动与对象上下文保持同步。例如:您可以运行查询以将对象加载到上下文中...
dbContext.Customers.Where(c => c.Country == "Alice's Wonderland").Load();

...然后将上下文中的对象公开为一个ObservableCollection...

ObservableCollection<Customer> 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的概述。


如果按照这种方式进行操作,您将如何处理验证?您会让实体模型实现IDataErrorInfo/INotifyDataError吗? - Cocowalla
@Cocowalla:我相信我是这样做的,是的。但是我已经有一段时间没有使用WPF了,所以我无法确定什么是最好的方法。如果您想要专业的答案,最好提出一个单独的问题 :) - Slauma
我已经提过一个单独的问题了,但还是谢谢你的回复 :) - Cocowalla

6

ObservableCollection实现了INotifyPropertyChangedINotifyCollectionChanged,这两者都是WPF用于重新绑定元素到UI的。因此,您可以向ObservableCollection添加一个项目,即可立即更新UI而无需您进行任何代码交互。而ObjectSet则没有实现这两个接口,因此无法获得这种功能。


太棒了!还有一个问题,如果我向ObservableCollection添加一个新项,那么UI会知道它,但ObjectSet(上下文)不知道任何更改。...如何解决这个问题??? - Cartesius00
每当您将项目添加到ObservableCollection时,也将其添加到上下文中。例如:MyComlexObject x = new MyComplexObject(); myObservableCollection.Add(x); myContext.ComplexObjects.Add(x); - Tejs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接