WPF ViewModel GC

本文关键字:GC ViewModel WPF | 更新日期: 2023-09-27 17:50:23

我有一个ViewModel,当从一个模型接收到一个事件时,通过更新对话框的ViewModel并将其传递给对话框进行数据绑定,从而向用户显示一个对话框,即

public class MainViewModel
{
    ...
    private void OnModelRaisedEvent(object sender, EventArgs e)
    {
        DialogViewModel dialogViewModel = new DialogViewModel();
        Window dialog = new DialogView(dialogViewModel);
        dialog.ShowDialog();
    }
 }

在对话框的视图中,我钩到一个按钮,点击来关闭窗口,即

public class DialogView : Window
{
    public DialogView(DialogViewModel viewModel)
    {
        InitializeComponent();
        Loaded += (s,e) => {DataContext = viewModel; };
    }
    ...
    private void ButtonOnClick(object sender, RoutedEventArgs e)
    {
        Close();
    }
 }

因为只有DialogView正在使用DialogViewModel,我可以确信我不会在这里得到内存泄漏吗?

例如,如果我多次打开和关闭对话框,当DialogView关闭时,DialogViewModel会被GC化吗?这样就不会积累多个DialogViewModel实例了。在任务管理器中观察内存使用情况,当多次打开和关闭DialogView时,它确实会上升,但不确定这是否因为GC还没有启动

WPF ViewModel GC

实际上你现在有依赖注入,因为你是通过构造函数将视图模型注入到对话框中。

当对话框视图运行时,它包含一个引用MainViewModel中的dialogViewModel

当您关闭对话框时,控制权被交还给OnModelRaisedEvent方法,之后,该方法立即结束(dialog.ShowDialog()之后没有其他代码),并且GC收集变量dialogViewModel,因为它的范围仅限于该方法。

所以,底线是:你应该能够使用你的代码没有问题。