我有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操作设置Func
或Main ViewModel
,以便每个新ViewModel
只调用&#39;它和Main ViewModel
将保存并更新UI所需的所有引用。
还有其他更好的方法来实现这一目标吗?我已经看到MVVM
与Entity Framework Code First
的一些很好的例子,但它们都没有与我的同时跨越多个ViewModels
的逻辑。
我倾向于在Func
中为每个操作调用Main ViewModel
,我认为这种方式更加清晰ViewModels
之间的依赖关系,所有数据操作仅限于一个类。
答案 0 :(得分:-1)
使用MVVM Light框架应该很容易实现。 MVVM Light使用一个名为“ViewModelLocator”的类来实例化和跟踪所有ViewModel。对于你的场景,我有:
的ViewModels:
查看:
MainViewModel拥有ObservableCollection<Costumer>
。
AddCostumerViewModel包含Costumer
。
将AddCostumerView上的控件绑定到AddCostumerViewModel中Costumer的属性。你有一个带有CommandBinding的Button,它来自AddCostumerViewModel中的一个方法,其中包括:
_viewModelLocator.MainViewModel.Costumers.Add(newCostumer);
您的Costumer
已添加到MainViewModel中的ObservableCollection<Costumer>
。
将新的Costumer
添加到您的ObservableCollection后,NotifyPropertyChanged
会触发,并且您的DataGrid会更新。