Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在MVVM中更新数据网格_Wpf_Entity Framework_Mvvm_Datagrid_Ef Code First - Fatal编程技术网

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的角度来看有什么好处,因为这会将视图模型与特定的实现甚至名称结合起来。