带有编辑记录按钮和多个编辑窗口的WPF MVVM Light DataGrid

时间:2013-02-14 17:25:33

标签: wpf mvvm datagrid viewmodel mvvm-light

我正在学习使用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的正确方法吗?

1 个答案:

答案 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上分配当前实例。