我在DataContext
Page.xaml.cs
DataContext = new PageViewModel();
在PageViewModel
我创建了Data Manager,它订阅了不同的事件,加载数据,为ViewModel生成事件。
但是,当我离开页面时,我的ViewModel和DataManager对象继续存在,当我再次访问此页面时,创建了新的ViewModel和DataManager,现在有两个对象加载相同的数据等。 如何避免这种泄漏?
答案 0 :(得分:1)
在VM中使用清理方法取消订阅所有事件并清除任何其他资源,然后在离开页面时调用方法。此外,在导航时将DataContext设置为null。
或者,为DataContext使用该ViewModel的单个实例,以便它不会被重新创建。了解MVVM Light如何使用ViewModelLocator轻松完成,但您可以轻松地自行完成,无需任何库。
答案 1 :(得分:0)
添加igrali的答案。您可以实现Viewmodel的单例实例(后者又包含数据管理器)。所以即使清理也没必要,因为你会有一个视图模型。
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(),只有在必要时才会创建。您可以进一步将网络引用为线程安全的单例实现,以处理可能同时对此类进行多次调用的情况。
如果您的数据管理器独立于viewmodel,您也可以为其他类实现相同的单例模式。