WPF MVVM Light DataGrid带编辑记录按钮和多个编辑窗口
问题描述:
我正在学习使用MVVM Light,并且正在制作一个使用实体框架的数据库优先模型的程序。WPF MVVM Light DataGrid带编辑记录按钮和多个编辑窗口
我有一个DataGrid绑定到一个ViewModel,它从一个Repository中获取数据。我试图创建一个按钮,当它被点击时打开一个窗口,绑定到它自己的View Model并允许你添加一个记录通过将其添加到存储库中,DataGrid具有一个事件,在添加项目时调用该事件,以便它可以更新DataGridViewModel。
这里的一切都很好。我打开表单,键入数据,按添加,记录被添加到数据库中,DataGrid会通过存储库事件自动刷新。
问题出现在打开多个“添加记录”窗口时。当我在其中一个窗口中键入内容时,它会显示在另一个窗口中。
我知道这是因为“添加记录”窗口的两个实例绑定到视图模型的同一实例。
有没有办法解决这个问题,所以每个窗口都可以独立?我知道目前这看起来并不是什么大问题,但是我将来会计划使用同一个窗口和相同的视图模型来编辑记录(这是一个很好的方法,您能否以某种方式推荐我记录ID或记录本身从DataGrid窗口添加/编辑记录窗口?)。
在此先感谢!告诉我,如果我错过了一些东西,我将它添加:)
编辑: 确定这就是我想出了:
public EditParentViewModel EditParent
{
get
{
EditParentViewModel editParentViewModelInstance = new EditParentViewModel(ServiceLocator.Current.GetInstance<IParentsRepository>(),
ServiceLocator.Current.GetInstance<IChildrenRepository>(),
ServiceLocator.Current.GetInstance<IBailiffsRepository>());
return editParentViewModelInstance;
}
}
这是工作,但这个是提供一个正确的方法视图模型的存储库?
答
计数您正在使用ViewModelLocator
,你应该有这样的事情:
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<AddRecordViewModel>();
}
public AddRecordViewModel AddRecordViewModel
{
get { return ServiceLocator.Current.GetInstance<AddRecordViewModel>(); }
}
}
只是每次都返回一个新的视图模式:
public class ViewModelLocator
{
public ViewModelLocator()
{
}
public AddRecordViewModel AddRecordViewModel
{
get { return new AddRecordViewModel(); }
}
}
这样,你的形式总是得到一个新的观点模型,而不是获取当前实例分配在您的ServiceLocator
。
视图模型单身?可以为每个对话框实例创建一个新的视图模型 – Joao 2013-02-14 17:33:25
是的,它是单身人士。我正在使用简单的IOC MVVM Light提供的,所以我不确定我应该如何为窗口的每个实例创建一个单独的viewmodel实例。 – Phoenix 2013-02-14 18:37:02