0

我正在学习使用 MVVM Light,我正在制作一个程序,它使用数据库优先模型和实体框架。

我有一个绑定到 ViewModel 的 DataGrid,它从 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;
        }
    }

它正在工作,但这是向视图模型提供存储库的正确方法吗?

4

1 回答 1

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.

于 2013-02-14T19:02:33.273 回答