【问题标题】:How to destroy the ViewModel object as soon as View is removed from the screenView 从屏幕上移除后如何销毁 ViewModel 对象
【发布时间】:2019-04-24 06:51:22
【问题描述】:

我在InitializeDataViewer() 中有一些代码,每次加载一个视图时都需要执行这些代码。我将代码保存在ViewModel 构造函数中。当我回来取回那个视图时,我的问题就出现了——构造函数没有被执行。有什么方法可以销毁 ViewModel 对象或其他方式来执行构造函数代码?

public Data_Viewer_View_Model()
{
    InitializeDataViewer();//this has to be executed eachtime the view is loaded.
    dataViewerModel = new Data_Viewer_Model();

    objBackToDatabase = new ButtonCommand<string>(dataViewerModel.BackToDatabase, dataViewerModel.IsValid);
    objBackToDatabase.ReturnValueChanged += objBackToDatabase_ReturnValueChanged;
}

InitializeDataViewer() 初始化了一些绑定的变量,但由于它没有被初始化,所以显示了旧值。

【问题讨论】:

  • 为什么不在构造函数中包含该代码,为什么不在窗口加载/激活事件中包含它?
  • 在尝试 mvvm 模式时有可能吗?感谢@peeyush 抽出宝贵时间。
  • 我认为MVVM模式在这里没有任何关系,目前你的方法调用是在viewModel中,如果你把它移到窗口加载事件中,那么它也会在viewModel中,所以在这里不相关.现在您在 InitializeDataViewer 中所做的事情以及是否应该在 viewModel 中可能是更相关的问题,但是由于我不知道里面是什么,所以我无法回答。
  • 您还没有解释为什么视图模型被持久化以及视图模型及其实例化如何与视图相关。听起来有些东西正在保留对您的视图的引用,并且保留了对视图模型的引用。您可以将初始化代码移动到视图模型中的公共方法,从 ctor 调用它,并且无论何时执行您正在执行的操作。

标签: c# wpf mvvm viewmodel


【解决方案1】:

如果我理解你的正确,解决它的方法是将属性的初始化移动到你的 VM (ViewModel) 上的一个方法。我们将其命名为 Reset()

然后从您的视图中绑定到 VM 属性。

如果您想在显示视图时再次重置值。我只会让负责导航的任何代码在 VM 上调用 Reset()。通常,当我进行导航时,我的 ViewModel 中总是有一个 NavigatedTo() 方法和一个 NavigatedFrom() 方法,我让导航服务调用它们。所以在 NavigatedTo 中你可以调用 Reset()。在 VM 构造函数中,您还可以调用 Reset()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2015-06-19
    • 1970-01-01
    相关资源
    最近更新 更多