2016-03-22 2 views
0

Я использую шаблон WPF и MVVM для разработки настольного приложения. Возможно, я не знаю, как будет работать элемент управления DataGrid, но если я изменю элемент (текст, флажок и т. Д.), Эта модификация сохранится, даже если я не буду делать постоянного обновления базы данных (используя Entity Framework). Например, я могу переключиться на просмотр разных данных, и когда я вернусь, чтобы просмотреть сетку с измененными данными (но без сохранения в db), это изменение. Каким-то образом данные в памяти были изменены с помощью элемента управления DataGrid и не обновлены или не синхронизированы с базой данных.WPF DataGrid автоматически обновляет данные в памяти?

Другими словами, данные в DataGrid остались модифицированными до тех пор, пока я не остановлю и не запустил его из визуальной студии.

  • ОБНОВЛЕНО: Еще один способ задать этот вопрос будет: Что на самом деле происходит, когда я обновляю, скажем, пункт в DataGrid? Если он привязан к свойству ViewModel P в двухстороннем режиме, то я предполагаю, что 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); 
    } 
} 

ответ

0

Если вы переключитесь обратно, вы переключаетесь на сбор в памяти, которая была обновлена ​​с помощью DataGrid раньше. Или вы снова загружаете данные из dtb?

EDIT:

Хорошо, теперь, как вы разместили код, я знаю, где проблема. DataGrid не обновляется, как я думал. Удостоверьтесь, что вы будете поднимать NotifyProperyChanged в свойстве UserList. Тогда это сработает. См. Также класс ObservableCollection.

+0

Предположим, я переключился на другую View/ViewModel. И когда я переключаюсь обратно на «ViewModel», где хранится «DataGrid», всегда существует метод «RetrieveData()», который в конечном итоге приводит к запросу выбора «EF». Но я полагаю, что этот запрос не связывается с реальной базой данных, поскольку записи db не повреждены. – tab87vn

+0

Ну, попробуйте отладить, если он действительно перезагружает данные. Я бы сказал, что вы не обновляете контекст, а datagrid подключен к предыдущей обновленной коллекции. – Divisadero

+0

Я подозреваю, что экземпляр 'DbContext', который создается при запуске приложения (в загрузочном блоке контроллера), и получает инъекцию во все вызванные' ViewModel'. Правильно ли это, или я должен создавать новый экземпляр 'DbContext' каждый раз, когда мне нужно его использовать (например,когда загружается View/ViewModel) – tab87vn

Смежные вопросы