更新MVVM中的DataGrid

时间:2015-03-31 15:24:15

标签: wpf entity-framework mvvm datagrid ef-code-first

我有DataGrid显示来自Entity Framework Code First上下文的行。我不确定自动更新DataGrid

的最佳方法

我打开一个新窗口,用户可以添加新的Costumer,一旦用户填写表单并点击Save按钮,该窗口ViewModel会将Costumer添加到Business Context,但显示DataGrid的{​​{1}}位于Costumers,由Main Window控制。

我不太确定让Main ViewModel显示最近添加的DataGrid的最佳方法。我只能考虑这些方式:

  • 我会在Costumer中创建ObservableCollection<Costumer>DataGrid Data Binding Source),并在Main ViewModel创建此Add New Costumer ViewModel's Constructor时将其传递给Main ViewModel新窗口,以便新窗口ViewModel可以在Costumer的新实例中添加新的Business Context,并将Costumer添加到ObservableCollection同样。

  • 我可以在其中创建Business Context ObservableCollection<Costumer>,并在每次运行Add Costumer方法时更新此集合。 Business Context在整个应用中必须是Singleton,并传递ViewModels创建的所有Main ViewModel和新窗口。

  • 我可以在Update Action上设置Main ViewModel,并从每个Action调用此New Window ViewModel。此Action将运行一种方法,以便从ObservableCollection<Costumer>更新Main ViewModel中的Business Context,从而更新DataGrid

  • 我可以为应用程序必须对Action执行的每个CRUD操作设置FuncMain ViewModel,以便每个新ViewModel只调用&#39;它和Main ViewModel将保存并更新UI所需的所有引用。

还有其他更好的方法来实现这一目标吗?我已经看到MVVMEntity Framework Code First的一些很好的例子,但它们都没有与我的同时跨越多个ViewModels的逻辑。

我倾向于在Func中为每个操作调用Main ViewModel,我认为这种方式更加清晰ViewModels之间的依赖关系,所有数据操作仅限于一个类。

1 个答案:

答案 0 :(得分:-1)

使用MVVM Light框架应该很容易实现。 MVVM Light使用一个名为“ViewModelLocator”的类来实例化和跟踪所有ViewModel。对于你的场景,我有:

的ViewModels:

  • MainViewModel
  • AddCostumerViewModel

查看:

  • 的MainView
  • AddCostumerView

MainViewModel拥有ObservableCollection<Costumer>。 AddCostumerViewModel包含Costumer

将AddCostumerView上的控件绑定到AddCostumerViewModel中Costumer的属性。你有一个带有CommandBinding的Button,它来自AddCostumerViewModel中的一个方法,其中包括:

_viewModelLocator.MainViewModel.Costumers.Add(newCostumer);

您的Costumer已添加到MainViewModel中的ObservableCollection<Costumer>。 将新的Costumer添加到您的ObservableCollection后,NotifyPropertyChanged会触发,并且您的DataGrid会更新。