Wpf 在MVVM中更新数据网格
我有一个Wpf 在MVVM中更新数据网格,wpf,entity-framework,mvvm,datagrid,ef-code-first,Wpf,Entity Framework,Mvvm,Datagrid,Ef Code First,我有一个DataGrid首先显示实体框架代码上下文中的行。我不确定自动更新我的DataGrid的最佳方法 我正在打开一个新窗口,用户可以在其中添加新的customer,一旦用户填写表单并单击Save按钮,窗口的ViewModel将customer添加到业务上下文中,但是显示客户的数据网格位于主窗口,由主视图模型控制 我不太确定让DataGrid显示最近添加的customer的最佳方法。我只能这样想: 我将在主视图模型中创建一个可观察集合(作为数据网格数据绑定源),并在主视图模型创建此新窗口时将
DataGrid
首先显示实体框架代码
上下文中的行。我不确定自动更新我的DataGrid
的最佳方法
我正在打开一个新窗口,用户可以在其中添加新的customer
,一旦用户填写表单并单击Save
按钮,窗口的ViewModel
将customer
添加到业务上下文中,但是显示客户的数据网格
位于主窗口
,由主视图模型
控制
我不太确定让DataGrid
显示最近添加的customer
的最佳方法。我只能这样想:
- 我将在
主视图模型
中创建一个可观察集合
(作为数据网格数据绑定源
),并在主视图模型
创建此新窗口时将其传递给添加新客户视图模型的构造函数
,因此,新窗口的ViewModel
可以在业务上下文的新实例中添加新的customer
,也可以将customer
添加到可观察集合中
- 我可以创建一个
业务上下文
,其中包含一个可观察集合
,并在每次运行添加客户
方法时更新此集合。Business Context
必须是整个应用程序中的Singleton
,在ViewModels
和Main ViewModel
创建的新窗口中传递
- 我可以在
主视图模型上执行更新操作
,并从每个新窗口视图模型
调用此操作
。此操作
将运行一种方法,从业务上下文
更新主视图模型
中的可观察集合
,从而更新数据网格
- 我可以对应用程序在
Main ViewModel
上执行的每个CRUD操作执行Action
或Func
,这样每个新的ViewModel
只需调用它,Main ViewModel
就会保存它并更新UI所需的所有引用
有没有其他更好的方法来实现这一点?我看到了一些很好的MVVM
示例,其中entityframeworkcodefirst
,但没有一个像我这样的逻辑能够同时跨越多个ViewModels
我倾向于在主视图模型
中为每个操作调用Func
,我认为这种方法更能清除视图模型
之间的依赖关系,并且所有数据操作都被限制在一个类中。使用MVVM Light框架应该很容易实现这一点。MVVM Light使用名为“ViewModelLocator”的类来实例化和跟踪所有ViewModel。对于您的场景,我有:
视图模型:
- 主视图模型
- AddCustomerViewModel
观点:
- 主视图
- AddCustomerView
MainViewModel保存一个可观察集合
。
AddCustomerViewModel保存一个客户
您可以将AddCustomerView上的控件绑定到AddCustomerView模型中的Customer属性。在AddCustomerViewModel中有一个按钮,该按钮带有一个CommandBinding到一个方法,该方法包括以下内容:
_viewModelLocator.MainViewModel.Costumers.Add(newCostumer);
您的customer
将添加到MainViewModel中的ObservableCollection
。
当新的customer
添加到您的ObservableCollection时,NotifyPropertyChanged
将启动并更新您的数据网格。Prism(我正在使用)也有一个viewmodel定位器。。。。但是按照你的说法,我可以在MainViewModel中创建一个静态方法,而这不需要定位器,它仍然是一个绑定的引用,不是吗?satic方法可以是MainViewModel.addcuser(cuser);这将使所有客户都能访问上下文和ObservableCollection,更新数据网格。我不明白为什么视图模型定位器会在这方面做任何更改,以及从MVVM的角度来看有什么好处,因为这会将视图模型与特定的实现甚至名称结合起来。