【问题标题】:ObservableCollection better than ObjectSetObservableCollection 优于 ObjectSet
【发布时间】:2013-05-11 01:03:29
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    (请注意您的“另一个问题”点)

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

    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 上下文中/从 EF 上下文中删除。调用SaveChanges 会将对象插入/删除数据库。

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

    dbContext.Customers.Add(newCustomer);
    dbContext.Customers.Remove(oldCustomer);
    

    ... 自动更新 Local 集合并因此触发 WPF 绑定引擎更新 UI 的通知。

    Here 是关于 EF 4.1 中 Local 的概述。

    【讨论】:

    • 如果您这样做,您将如何处理验证?你会让实体模型实现 IDataErrorInfo/INotifyDataError 吗?
    • @Cocowalla:我相信我是这样做的,是的。但是一段时间以来我不再使用 WPF,所以我真的不知道什么是最好的方法。如果你想要专业的答案,你最好问一个单独的问题:)
    • 我已经问了一个单独的问题,但感谢您的回复:)
    【解决方案2】:

    ObservableCollection 实现了INotifyPropertyChangedINotifyCollectionChanged,WPF 使用这两者将元素重新绑定到 UI。因此,您可以向 ObservableCollection 添加一个项目,并且 UI 会立即更新,而无需您进行任何代码交互。 ObjectSet 两者均未实现,因此无法获得此功能。

    【讨论】:

    • 太棒了!还有一个问题,如果我向 ObservableCollection 添加一个新项目,那么 UI 会知道它,但 ObjectSet(上下文)不知道任何更改。 ...如何解决这个问题???
    • 每当您将项目添加到 ObservableCollection 时,也只需将其添加到您的上下文中。例如:MyComlexObject x = new MyComplexObject(); myObservableCollection.Add(x); myContext.ComplexObjects.Add(x);
    • 哦,这么简单?非常感谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2012-08-27
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多