在离开页面时销毁数据上下文

本文关键字:数据 上下文 离开 | 更新日期: 2023-09-27 18:05:53

我将DataContext设为Page.xaml.cs

DataContext = new PageViewModel();

PageViewModel中,我创建了Data Manager,它订阅不同的事件,加载数据,为ViewModel生成事件。

但是,当我离开页面我的ViewModel和DataManager对象继续生活,当我再次去这个页面,新的ViewModel和DataManager创建,现在有两个对象加载相同的数据等。如何避免这种泄漏?

在离开页面时销毁数据上下文

在您的VM中设置一个清除方法来取消订阅所有事件并清除任何其他资源,然后在导航离开页面时调用该方法。另外,当导航离开时,将DataContext设置为null。

或者,为DataContext使用该ViewModel的单个实例,这样它就不会被重新创建。看看MVVM Light如何使用ViewModelLocator轻松地为您完成此操作,但您也可以在没有任何库的情况下轻松地自己完成。

添加到igrali的答案中。您可以实现视图模型的单例实例(它又包含数据管理器)。因此,即使清理也没有必要,因为你将有一个单一的视图模型。

    public class MyViewModel
    {
         private static MyViewModel instance;
         private MyViewModel() {}
         public static MyViewModel Instance
         {
            get 
            {
             if (instance == null)
                {
                    instance = new MyViewModel();
                }
             return instance;
            }
          }
      }

所以,不是每次都调用一个新的Viewmodel(),你可以只调用MyViewModel.instance(),它只会在必要的时候创建。您可以进一步引用net来获取线程安全的单例实现,以处理同时对该类进行多个调用的情况(这是可能的)。

如果你的数据管理器是独立于视图模型的,你也可以为其他类实现同样的单例模式。