#wpf #entity-framework
#wpf #entity-framework
Вопрос:
Я создал новый объект entity и привязал его к элементам управления в другом окне (окно редактирования). После изменения и сохранения я назначил новый объект entity объекту в главном окне. Старый объект entity привязан к сетке данных, теперь я хочу, чтобы в сетке данных отображались данные, которые я изменил и сохранил.
Метод ObjectContext.Refresh (RefreshMode, Object) кажется тем, что я хочу, но я не знаю, как его правильно использовать.
Короче говоря :
У меня есть главное окно с datagrid, отображающее все данные таблицы. Пользователи могут выбрать одну строку и отредактировать ее в окне редактирования. После сохранения в datagrid должно отображаться то, что было изменено.
Комментарии:
1. Как вы структурировали свой WPF — как проект vanilla / default или MVVM?
2. Черт возьми, я перетаскиваю объект для создания сетки данных в mainwindow. Для окна редактирования я задаю datacontext с запросом. Например: datacontext = MyContext.customer.where(q=>q.id.equal(id_selected_from_mainwindow));
Ответ №1:
Здесь лучше всего использовать an ObservableCollection
в качестве источника данных для datagrid вместо запроса.
И посмотрите на реализацию INotifyPropertyChanged
интерфейса в вашем Customer
классе.
Изначально ObservableCollection
заполняется запросом к базе данных. Пользовательские изменения вносятся в элементы внутри ObservableCollection
и после завершения вам просто нужно инициировать перенос изменений туда, где вы изначально получили свой список Customer
объектов
При этом изменения, внесенные как в коллекцию клиентов, так и в отдельные объекты клиентов (если они присутствуют в datagrid), будут автоматически обновлены для вас.
Редактировать
Должен признать, что я немного спешу предлагать какой-либо код на данный момент, но вот довольно хорошая статья, в которой объясняется, как использовать ObservableCollections
и классы, которые реализуют INotifyPropertyChanged
. В нем также есть примеры кода, которые, хотя в VB.NET это должно дать вам достаточно идей, чтобы начать работу.
По сути, вы разделяете свой код на отдельные уровни UI (View), бизнес-логику (модель представления) и уровень данных (модель, в которой находится ваша entity Framework).
Вы привязываете свою сетку данных к свойству ObservableCollection type в своем классе Customers, и ваше окно редактирования csutomer привязывается к экземпляру вашего класса Customer.
Комментарии:
1. Крисбд, не могли бы вы показать мне пример того, как заставить коллекцию клиентов обновлять изменения из отдельных объектов Customer?
2. Привет — сегодня недостаточно времени для написания и публикации кода, но взгляните на статью, на которую я добавил ссылку в свой ответ — она объяснит больше.
3. Даже со связанным примером я изо всех сил пытаюсь понять, как использовать ObservableCollection для обнаружения изменений, внесенных в объект entity, из отдельного окна в шаблоне MVVM. Как ObservableCollection может узнать, что один из его элементов изменен, без того, чтобы проекты просмотра связывались с проектом модели для определения типа объекта сущности и деталей?
4. Извините, Джесслин, меня давно не было. Привяжите свой View XAML к наблюдаемой коллекции. О любых изменениях, внесенных в коллекцию, NET framework уведомляет представление. Вам не нужно ничего обрабатывать самостоятельно. Для передачи изменений, внесенных пользователем в пользовательский интерфейс, обратно в базу данных, я бы предложил реализовать кнопку «Сохранить», которая запускает команду для передачи обновлений обратно на уровень данных.