我正在学习使用MVVM Light,我正在制作一个使用数据库优先模型和Entity Framework的程序。
我有一个绑定到ViewModel的DataGrid,后者从Repository获取数据。我正在尝试创建一个按钮,当单击该按钮时会打开一个窗口,该窗口绑定到自己的View Model并允许您添加记录到DataGrid通过将其添加到存储库,该存储库具有一个事件,在添加项目时调用它,以便它可以更新DataGridViewModel。
这里的一切都很好。我打开表单,输入数据,按add并将记录添加到数据库中,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;
}
}
它正在运行,但这是将存储库提供给View Model的正确方法吗?
答案 0 :(得分:0)
指望您使用的是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
上分配当前实例。