我有一个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框架。
答案 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();
}
}
}