2013-02-14 135 views
0

我正在学习使用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; 
     } 
    } 

这是工作,但这个是提供一个正确的方法视图模型的存储库?

+0

视图模型单身?可以为每个对话框实例创建一个新的视图模型 – Joao 2013-02-14 17:33:25

+0

是的,它是单身人士。我正在使用简单的IOC MVVM Light提供的,所以我不确定我应该如何为窗口的每个实例创建一个单独的viewmodel实例。 – Phoenix 2013-02-14 18:37:02

回答

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

+0

只有一件小事情可以检查主要问题上的编辑。 :) – Phoenix 2013-02-14 19:41:30

+0

具有相同视图模型的多个实例是完全好的(也是常见的)。检查'Si​​mpleIoc.Register()'重载并查看除了查看模式类型之外您还可以传递一个键。然后你可以使用同样的密钥'GetInstance()'。关于如何实施ServiceLocator的底线由您决定。您可以使用其他IoC库的事件,但再次,多个实例都可以。 – Joao 2013-02-14 20:55:40

+0

好的非常感谢你的帮助:) – Phoenix 2013-02-14 22:10:02