Я использую шаблон WPF и MVVM для разработки настольного приложения. Возможно, я не знаю, как будет работать элемент управления DataGrid
, но если я изменю элемент (текст, флажок и т. Д.), Эта модификация сохранится, даже если я не буду делать постоянного обновления базы данных (используя Entity Framework
). Например, я могу переключиться на просмотр разных данных, и когда я вернусь, чтобы просмотреть сетку с измененными данными (но без сохранения в db), это изменение. Каким-то образом данные в памяти были изменены с помощью элемента управления DataGrid
и не обновлены или не синхронизированы с базой данных.WPF DataGrid автоматически обновляет данные в памяти?
Другими словами, данные в DataGrid
остались модифицированными до тех пор, пока я не остановлю и не запустил его из визуальной студии.
- ОБНОВЛЕНО: Еще один способ задать этот вопрос будет: Что на самом деле происходит, когда я обновляю, скажем, пункт в
DataGrid
? Если он привязан к свойству ViewModelP
в двухстороннем режиме, то я предполагаю, чтоP
будет обновлен. Но даже если я обновляю его значение (установка P на null, а затем вызов методов доступа к данным снова), измененные данные все еще существуют.
Есть ли у кого-нибудь представление о том, что произошло?
Спасибо!
ОБНОВЛЕНО 2: Вот код XAML, который связывает DataGrid с свойство с именем UserList в ViewModel
.
<DataGrid
x:Name="UserList"
ItemsSource="{Binding UserList, Mode=TwoWay}"
AutoGenerateColumns="False"
AllowDrop="True"
RowBackground="Orange"
AlternatingRowBackground="#FFC4B0B0">
<!-- define columns to view -->
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>
Вот код работает в ViewModel
. Метод InitialiseData()
вызывается в конструкторе виртуальной машины и прежде чем я хочу сделать что-то еще с постоянными данными, поэтому я всегда должен быть обновлен.
private void InitialiseData()
{
// Retrieves user list from the business layer's response
Response userList = _userBL.GetUserList();
if (userList is FailResponse)
{
MessageBox.Show(userList.Message);
return;
}
else
{
UserList = null;
UserList = (IEnumerable<User>)((SuccessResponse)userList).Data;
}
** ОБНОВЛЕНО 3 **:
private IEnumerable<User> _userList;
public IEnumerable<User> UserList
{
get
{
return _userList;
}
set
{
_userList = value;
NotifyOfPropertyChange(() => UserList);
}
}
Предположим, я переключился на другую View/ViewModel. И когда я переключаюсь обратно на «ViewModel», где хранится «DataGrid», всегда существует метод «RetrieveData()», который в конечном итоге приводит к запросу выбора «EF». Но я полагаю, что этот запрос не связывается с реальной базой данных, поскольку записи db не повреждены. – tab87vn
Ну, попробуйте отладить, если он действительно перезагружает данные. Я бы сказал, что вы не обновляете контекст, а datagrid подключен к предыдущей обновленной коллекции. – Divisadero
Я подозреваю, что экземпляр 'DbContext', который создается при запуске приложения (в загрузочном блоке контроллера), и получает инъекцию во все вызванные' ViewModel'. Правильно ли это, или я должен создавать новый экземпляр 'DbContext' каждый раз, когда мне нужно его использовать (например,когда загружается View/ViewModel) – tab87vn