ViewModel - >模型互动

时间:2011-06-16 10:17:00

标签: wpf mvvm model viewmodel

假设我有一个WPF / MVVM应用程序来管理一些假设的客户:)。

域模型包含名为Customer的实体(在代码中表示为POCO)。

主屏幕包含一个网格,绑定到一个视图模型(CustomersViewModel),该模型从Repository<顾客>

主屏幕还允许创建新客户(并将其保存到数据库)。

假设我需要实现“添加客户”用例。最明显的方法如下:

  1. 向用户显示一个对话框窗口,以填写新的客户数据。
  2. 在ViewModel中单击“保存”按钮。
  3. 使用对话框中的数据创建客户(var new_customer = new Customer(..))域对象(步骤1)。
  4. 呼叫存储库<客户>。保存(new_customer)以将新客户保存到数据库。
  5. 使用来自数据库的最新数据重新加载CustomersViewModel,以便新添加的客户在网格中可见。
  6. 就个人而言,我不喜欢这种“快速而肮脏”的方式(因为每次添加新客户时都需要从DB重新加载完整的客户列表。)

    任何人都可以提出更好的方法(不需要从数据库刷新客户列表)???我觉得必须有一些最佳实践来处理这样的场景:))。

    提前致谢!

4 个答案:

答案 0 :(得分:0)

如果保存Customer成功,为什么不能只将单个Customer实例添加到您的客户群中?除非用户明确刷新视图(通常通过刷新按钮),否则无需重新加载所有客户。

答案 1 :(得分:0)

如果您通过绑定(到客户列表)在视图中加载列表,您只需将新客户添加到该列表中,所有内容都是alredy; - )

答案 2 :(得分:0)

我有一个类似的应用程序,在UI中创建对象。我通过在VM中添加对象然后单击“保存”按钮将其与“模型”同步来解决此问题。

我假设您在CustomersViewModel中有一个CustomerViewModel列表,网格视图绑定到该列表。您可以将新的CustomerViewModel对象添加到CustomersViewModel中的列表中。在将ViewModel数据保存回模型时,模型与VM同步。除非您的应用程序之外的其他人正在更改模型数据,否则无需从模型中刷新VM。

答案 3 :(得分:0)

您可以创建一个ObservableCollection<Customer>并将其填入您希望在视图中显示的数据库中的客户。添加新客户时,将其添加到此集合中,并将其保存到数据库中。 CustomersView绑定ObservableCollection并自动更新,无需刷新数据库中的数据。

WPF Application Framework (WAF) BookLibrary 示例应用程序展示了如何做到这一点。