【问题标题】:How to reset a viewmodel in mvvm如何在 mvvm 中重置视图模型
【发布时间】:2014-08-04 13:56:30
【问题描述】:

当用户单击视图上的新按钮并将视图模型作为数据上下文时,我如何重置我的视图模型?

例如:

如果我有一个视图 NewCustomer 并在保存时,数据将保存到数据库并显示新创建的帐号。但是当用户单击屏幕中的新建按钮时,我希望重新初始化视图(视图模型)。或者,如果用户单击屏幕中的取消以清除所有更改。

我怎样才能做到这一点?我使用 Prism 5.0 和 Unity 作为我的容器。

如果我使用 IRegionMemberLifetime,我可以在导航离开并再次导航到视图时清除视图模型数据(通过在导航离开之前单击新建按钮将 KeepAlive 设置为 false)。但我希望在不导航的情况下清除表单。这个可以吗?

【问题讨论】:

  • Customer = new Customer() 有什么问题?
  • 我所有的视图模型都是由容器注入的。我正在查看 Troels Larsen 的建议

标签: wpf mvvm prism


【解决方案1】:

您可以有一个屏幕/工作区ViewModel,以及另一个包装您的数据的 ViewModel。

所以有两个类:CarScreenViewModelCarViewModel

CarScreenViewModel 会有一个属性,比如CurrentCar,它反映了屏幕中当前选择的内容。然后,当单击Create 按钮时,您只需设置:

 CurrentCar = new CarViewModel();

重置部分加载的数据只会导致难以重现的行为。最好从一个新实例开始。

【讨论】:

  • 根据您的建议,我将添加 NewCustomerViewModel 和 CurrentCustomer 将是其中的财产。因此,当用户单击 New 时,CurrentCustomer 设置为 CurrentCustomer = new Customer()。 NewCustomerViewModel 由 DI 初始化,我可以让 NewCustomerViewModel 构造函数初始化 CurrentCustomer。让我试试这个。
  • 为什么人们将实体/数据模型称为视图模型?数据模型应该只包含数据(INotifyPropertyChanged 等是“允许的”)。视图模型包含视图的逻辑,通常具有命令、数据模型和数据模型集合。只是选择这个,因为我到处都看到这个错误,甚至是由 ms 提供的。虽然投票=)
  • @Stian:嗯,它是 MVVM,而不是 MVVMDM :) 在我的示例中,CarScreenViewModelCarViewModel 之间确实没有区别,任何 ViewModel 都有准备显示数据的目的在视图中 - 甚至是您调用 DataModel 的那些。拥有DataModel 实现逻辑也没有错。至少从我的观点来看。话虽如此,我已经看到了 MVVM 的各种实现,包括 DataModels、Presenter,在一种情况下,甚至是 Controller。
【解决方案2】:

您的标准方法如下所示

视图模型

CustomersContainerViewModel 其中包含

CustomerViewModel 的集合 和ICommands 喜欢

CreateNewCustomer
DeleteExistingCustomer
UpdateExistingCustomer

您的视图将包含 CustomersContainerView 将包含 所需 UI 元素中的客户对象集合 一个创建新客户的按钮(它将启动一个新屏幕,其中包含 newCustomer 字段,它还可以包含取消,这将关闭表单) 要删除的按钮(也可以是 ContextMenu) 一个更新按钮(也可以是 ContextMenu),它将启动一个客户表单,其中包含来自 DB 的详细信息。

希望这是有道理的...如果您对上述任何问题有任何疑问,请告诉我

更新 - 忘记添加。 NewCustomer 命令将向您的 CustomerCollection 添加一个新的 Customer 对象,并且应该打开一个 NewCustomer 表单(或您选择的任何内容)供用户输入客户详细信息。取消/删除只会从集合中删除该记录。删除也会更新数据库

【讨论】:

    【解决方案3】:

    就我而言

    yourViewName.variableName.postValue("")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多