ObservableCollection лучше, чем ObjectSet

#c# #.net #wpf #entity-framework #data-binding

#c# #.net #wpf #entity-framework #привязка к данным

Вопрос:

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

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

Ответ №1:

(Примечание к вашему пункту «Еще один вопрос»)

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.

Комментарии:

1. Как бы вы справились с проверкой, если бы делали все таким образом? Хотели бы вы, чтобы модели сущностей реализовывали IDataErrorInfo / INotifyDataError?

2. @Cocowalla: Я считаю, что я сделал это таким образом, да. Но с некоторых пор я больше не работаю с WPF, поэтому я действительно не могу сказать, какой способ лучше. Вам лучше задать отдельный вопрос, если вы хотите получить профессиональные ответы 🙂

3. Я уже задавал отдельный вопрос, но спасибо за ваш ответ 🙂

Ответ №2:

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

Комментарии:

1. Потрясающе! И еще один вопрос, если я добавлю новый элемент в ObservableCollection, пользовательский интерфейс узнает об этом, но ObjectSet (контекст) не знает о каких-либо изменениях. …как решить эту проблему???

2. Всякий раз, когда вы добавляете элемент в ObservableCollection, также просто добавляйте его в свой контекст. Пример: MyComlexObject x = new MyComplexObject(); myObservableCollection.Add(x); myContext.ComplexObjects.Add(x);