【问题标题】:WPF DataGrid automatically updates in-memory data?WPF DataGrid 自动更新内存数据?
【发布时间】:2016-03-23 17:10:07
【问题描述】:

我正在使用 WPF 和 MVVM 模式来开发桌面应用程序。也许我不清楚DataGrid 控件是如何工作的,但是如果我修改一个项目(文本、复选框等),即使我没有进行任何永久数据库更新(使用Entity Framework )。例如,我可能会切换到查看不同的数据,当我回来查看带有修改数据的网格时(但没有保存到 db),变化就在那里。不知何故,内存中的数据已被 DataGrid 控件更改,并且未刷新或与数据库同步。

换句话说,DataGrid 中的数据一直被修改,直到我停止并从 Visual Studio 重新运行它。

  • 更新: 提出这个问题的另一种方法是:当我更新一个DataGrid 的项目时,实际上会发生什么?如果它以双向模式绑定到 ViewModel 的属性P,那么我想P 将被更新。但即使我刷新它的值(将 P 设置为 null 然后再次调用数据访问方法),修改后的数据仍然存在。

有人知道发生了什么吗?

谢谢!

更新 2: 这是将 DataGrid 绑定到 ViewModel 中名为 UserList 的属性的 xaml 代码。

<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() 方法在 VM 的构造函数中被调用,并且在我想对持久数据做其他事情之前,所以我想总是刷新。

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

【问题讨论】:

    标签: wpf mvvm datagrid


    【解决方案1】:

    如果您切换回来,您将切换到之前由 DataGrid 更新的内存中集合。还是再次从 dtb 加载数据?

    编辑:

    好的,现在您已经发布了代码,我知道问题出在哪里。 DataGrid 没有像我想的那样刷新。确保您将在属性 UserList 上引发 NotifyProperyChanged。然后它将起作用。参见 ObservableCollection 类。

    【讨论】:

    • 假设我切换到另一个 View/ViewModel。当我切换回DataGrid 所在的ViewModel 时,总会有一个RetrieveData() 方法最终导致EF 选择查询。但我认为该查询不会联系实际的数据库,因为 db 记录是完整的。
    • 好吧,尝试调试,如果它真的重新加载数据。我会说你不刷新上下文并且数据网格连接到以前更新的集合。
    • 我怀疑DbContext 实例是在应用程序启动时创建的(在控制器的引导程序中),并被注入到所有调用的ViewModel 中。这是正确的方法,还是应该在每次需要使用它时创建一个新的DbContext 实例(例如,当加载 View/ViewModel 时)
    • 你有没有在一些简单的模型上尝试过这个假设?
    • 啊,我没注意到。在 using(...){} 中应始终使用上下文。是的。
    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2018-10-26
    • 2013-11-06
    • 2010-12-19
    • 1970-01-01
    • 2018-12-03
    • 2015-12-04
    相关资源
    最近更新 更多