我有一个 ViewModel,它在从模型接收事件时,通过更新对话框的 ViewModel 并将其传递给对话框以进行数据绑定(bind),向用户显示一个对话框,即
public class MainViewModel
{
...
private void OnModelRaisedEvent(object sender, EventArgs e)
{
DialogViewModel dialogViewModel = new DialogViewModel();
Window dialog = new DialogView(dialogViewModel);
dialog.ShowDialog();
}
}
在对话框的 View 中,我挂入一个按钮,单击以关闭窗口,即,
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 尚未启动。
最佳答案
实际上您现在确实有依赖注入(inject),因为您是通过构造函数将 View 模型注入(inject)到对话框中。
当对话框 View 运行时,它包含对 MainViewModel
中的 dialogViewModel
的引用。
当您关闭对话框时,控件返回给 OnModelRaisedEvent
方法,紧接着,该方法结束(dialog.ShowDialog()
之后没有其他代码) >) 并且 GC 收集变量 dialogViewModel
,因为它的范围仅限于该方法。
因此,底线是:您应该能够毫无问题地使用您的代码。
关于c# - WPF View 模型 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30401114/