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还没有启动
实际上你现在有依赖注入,因为你是通过构造函数将视图模型注入到对话框中。
当对话框视图运行时,它包含一个引用到MainViewModel
中的dialogViewModel
。
当您关闭对话框时,控制权被交还给OnModelRaisedEvent
方法,之后,该方法立即结束(dialog.ShowDialog()
之后没有其他代码),并且GC收集变量dialogViewModel
,因为它的范围仅限于该方法。
所以,底线是:你应该能够使用你的代码没有问题。