#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);