WPF MVVM - DataGrid不会将更改更新回数据库

时间:2017-10-28 21:50:08

标签: c# wpf mvvm binding datagrid

我有一个WPF DataGrid绑定到我的NinjaList ViewModel中的ObservableCollection

volatile

定义Ninjas的方法

public ObservableCollection<NinjaVM> Ninjas { get; set; }

我的视图中的代码如下

public NinjaListVM()
        {
            using (var context = new NinjaApp_DatabaseEntities())
            {
                var ninjas = context.ninjas.ToList();
                Ninjas = new ObservableCollection<NinjaVM>(ninjas.Select(r => new NinjaVM(r)));
            }
        }

视图确实将Ninja表的所有内容显示在Grid中。此外,当进行更改时,它们会在应用程序运行的整个过程中持续存在。但是更改没有保存到数据库中。我的理解是,如果使用Mode = TwoWay绑定到这样的ObservableCollection,它应该自动将更改更新回数据库。但显然我错过了一些东西,有人可能会指出我做错了吗?

我使用MvvM Light作为MvvM框架。

1 个答案:

答案 0 :(得分:0)

是的,原因是您的Viewmodels无法直接访问数据库。

        //opening the database
        using (var context = new NinjaApp_DatabaseEntities()) 
        {
           //query the database and store the result in memory
            var ninjas = context.ninjas.ToList();

           //Viewmodel mapping
            Ninjas = new ObservableCollection<NinjaVM>(ninjas.Select(r => new NinjaVM(r)));
        } // in the end of the using statement the database will be "closed"

操纵忍者并不会影响数据库。

我怀疑你正在使用实体框架。

因此,如果要存储更改,则必须重新打开数据库,搜索特定的忍者并覆盖属性并使用SaveChanges Methode。

练习时可以在设置器中执行此操作

    public class NinjaVM
{

    private int _id;

    private string _name;
    public string Name
    {
        get { return _name; }
        set
        { 
            using (var context = new NinjaApp_DatabaseEntities())
            {
                var ninja = context.ninjas.FirstOrDefault(n => n.Id == _id  ));
                if(ninja == null)
                return;
                ninja.Name = value;
                context.SaveChanges();
            }
        }
    }