【问题标题】:Update a DataGrid in MVVM在 MVVM 中更新 DataGrid
【发布时间】:2015-03-31 15:24:14
【问题描述】:

我有一个 DataGrid 显示来自 Entity Framework Code First 上下文的行。我不确定自动更新我的DataGrid 的最佳方法。

我正在打开一个新窗口,用户可以在其中添加新的Costumer,一旦用户填写表格并单击Save 按钮,窗口的ViewModel 会将Costumer 添加到@987654328 @,但是显示CostumersDataGridMain Window中,由Main ViewModel控制。

我不太确定让DataGrid 显示最近添加的Costumer 的最佳方式。我只能考虑以下几种方式:

  • 我将在Main ViewModel 中创建一个ObservableCollection<Costumer>(作为DataGrid Data Binding Source)并在Main ViewModel 创建这个新窗口时将其传递给Add New Costumer ViewModel's Constructor,所以新窗口的ViewModel可以在Business Context 的新实例中添加新的Costumer,也可以将Costumer 添加到ObservableCollection

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

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

  • 我可以为应用程序必须在 Main ViewModel 上执行的每个 CRUD 操作创建一个 ActionFunc,因此每个新的 ViewModel 只需调用它,Main ViewModel 将保存并更新UI 所需的所有引用。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    视图模型:

    • 主视图模型
    • 添加消费者视图模型

    观看次数:

    • 主视图
    • 添加消费者视图

    MainViewModel 拥有一个ObservableCollection<Costumer>。 AddCostumerViewModel 拥有一个Costumer

    您将 AddCostumerView 上的控件绑定到 AddCostumerViewModel 中的 Costumer 属性。您有一个带有 CommandBinding 的按钮到 AddCostumerViewModel 中的方法,其中包括:

    _viewModelLocator.MainViewModel.Costumers.Add(newCostumer);
    

    您的 Costumer 被添加到 MainViewModel 中的 ObservableCollection<Costumer>。 当新的Costumer 添加到您的 ObservableCollection 中时,NotifyPropertyChanged 会触发并且您的 DataGrid 会更新。

    【讨论】:

    • Prism(我正在使用)也有一个视图模型定位器....但是按照你说的方式,我可以在 MainViewModel 中创建一个静态方法,这不需要定位器,它仍然是一个固定的参考,不是吗? satic 方法可以是 MainViewModel.AddCostumer(costumer);这将所有客户到上下文和 ObservableCollection 更新 DataGrid。我不明白为什么视图模型定位器会对此进行任何更改,以及从 MVVM 角度来看有什么好处,因为这将视图模型与特定实现甚至名称耦合在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多