WPF 视图模型 GC
WPF ViewModel GC
我有一个 ViewModel,它在从模型接收事件时,通过更新对话框的 ViewModel 并将其传递给对话框进行数据绑定,向用户显示一个对话框,即
public class MainViewModel
{
...
private void OnModelRaisedEvent(object sender, EventArgs e)
{
DialogViewModel dialogViewModel = new DialogViewModel();
Window dialog = new DialogView(dialogViewModel);
dialog.ShowDialog();
}
}
在对话框的视图中,我挂入一个按钮单击以关闭 window,即
public class DialogView : Window
{
public DialogView(DialogViewModel viewModel)
{
InitializeComponent();
Loaded += (s,e) => {DataContext = viewModel; };
}
...
private void ButtonOnClick(object sender, RoutedEventArgs e)
{
Close();
}
}
由于只有 DialogView 使用 DialogViewModel,我可以确信我不会在这里发生内存泄漏吗?
例如,如果我多次打开和关闭对话框,DialogViewModel 是否会在 DialogView 关闭时进行 GC,以免累积 DialogViewModel 的多个实例。在任务管理器中查看内存使用情况,多次打开和关闭 DialogView 时确实会上升,但不确定这是不是因为 GC 尚未启动。
实际上,您现在确实有依赖注入,因为您正在通过构造函数将视图模型注入到对话框中。
虽然对话框视图是 运行,但它包含对 MainViewModel
中 dialogViewModel
的 引用 。
当您关闭对话框时,控制权返回给 OnModelRaisedEvent
方法,紧接着,该方法结束(dialog.ShowDialog()
之后没有其他代码)并且 GC 收集变量 dialogViewModel
,因为它的范围仅限于该方法。
所以,底线是:您应该能够毫无问题地使用您的代码。
我有一个 ViewModel,它在从模型接收事件时,通过更新对话框的 ViewModel 并将其传递给对话框进行数据绑定,向用户显示一个对话框,即
public class MainViewModel
{
...
private void OnModelRaisedEvent(object sender, EventArgs e)
{
DialogViewModel dialogViewModel = new DialogViewModel();
Window dialog = new DialogView(dialogViewModel);
dialog.ShowDialog();
}
}
在对话框的视图中,我挂入一个按钮单击以关闭 window,即
public class DialogView : Window
{
public DialogView(DialogViewModel viewModel)
{
InitializeComponent();
Loaded += (s,e) => {DataContext = viewModel; };
}
...
private void ButtonOnClick(object sender, RoutedEventArgs e)
{
Close();
}
}
由于只有 DialogView 使用 DialogViewModel,我可以确信我不会在这里发生内存泄漏吗?
例如,如果我多次打开和关闭对话框,DialogViewModel 是否会在 DialogView 关闭时进行 GC,以免累积 DialogViewModel 的多个实例。在任务管理器中查看内存使用情况,多次打开和关闭 DialogView 时确实会上升,但不确定这是不是因为 GC 尚未启动。
实际上,您现在确实有依赖注入,因为您正在通过构造函数将视图模型注入到对话框中。
虽然对话框视图是 运行,但它包含对 MainViewModel
中 dialogViewModel
的 引用 。
当您关闭对话框时,控制权返回给 OnModelRaisedEvent
方法,紧接着,该方法结束(dialog.ShowDialog()
之后没有其他代码)并且 GC 收集变量 dialogViewModel
,因为它的范围仅限于该方法。
所以,底线是:您应该能够毫无问题地使用您的代码。