ObservableCollection лучше, чем ObjectSet - PullRequest
5 голосов
/ 01 июня 2011

Почему лучше (в WPF, C #, Entity Framework) связывать ListBox с ObservableCollection, созданным на ObjectSet (из Entity Framework), а не с ObjectSet напрямую?

Еще один вопрос: Когда я связываю ListBox с ObservableCollection, любые дополнения к коллекции обновляются ListBox. Отлично. Но ObservableCollection был создан на ObjectContext (в Entity Framework), и добавление нового элемента в коллекцию не добавляет элемент в контекст ... как решить эту проблему

Ответы [ 2 ]

15 голосов
/ 01 июня 2011

(обратите внимание на ваш пункт "Еще один вопрос")

Entity Framework 4.1 предлагает новую функцию, которая особенно полезна в приложениях WPF - локальное представление контекста объекта. Он доступен через свойство Local DbSet<T>. Local возвращает ObservableCollection<T>, содержащий все сущности типа T, которые в настоящее время присоединены к контексту (а не в состоянии Deleted).

Local полезен, потому что он автоматически синхронизируется с контекстом объекта. Например: вы можете запустить запрос для загрузки объектов в контекст ...

dbContext.Customers.Where(c => c.Country == "Alice's Wonderland").Load();

... и затем выставить объекты в контексте как ObservableCollection ...

ObservableCollection<Customer> items = dbContext.Customers.Local;

... и используйте это как ItemsSource некоторого WPF ItemsControl. Когда вы добавляете или удаляете объекты в / из этой коллекции ...

items.Add(newCustomer);
items.Remove(oldCustomer);

... они автоматически добавляются / удаляются в / из контекста EF. Вызов SaveChanges вставит / удалит объекты в / из базы данных.

Аналогично добавление или удаление объектов в / из контекста ...

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

... автоматически обновляет коллекцию Local и запускает уведомления для механизма привязки WPF для обновления пользовательского интерфейса.

Здесь - обзор Local в EF 4.1.

6 голосов
/ 01 июня 2011

ObservableCollection реализует INotifyPropertyChanged, а также INotifyCollectionChanged, оба из которых WPF использует для привязки элементов к пользовательскому интерфейсу. Таким образом, вы можете добавить элемент в ObservableCollection, и сразу же пользовательский интерфейс обновится без вмешательства вашего кода. ObjectSet не реализует ни один, и поэтому не получает эту функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...