在WPF中卸载对话框

时间:2012-01-27 16:47:21

标签: c# wpf xaml

我不确定ShowDialog是如何工作的

我这样做

NewReportDialog nrDialog = new NewReportDialog();
nrDialog.DataContext = ServiceLocator.Current.GetInstance<INewReportViewModel>();
nrDialog.WindowStartupLocation = WindowStartupLocation.CenterScreen;
nrDialog.Owner = Application.Current.MainWindow;
bool? dialogResult = nrDialog.ShowDialog();


  if (dialogResult.HasValue && dialogResult.Value)
   {
    Console.WriteLine(((INewReportViewModel)nrDialog.DataContext).ReportName);
    Console.WriteLine(((INewReportViewModel)nrDialog.DataContext).SelectedSite);
   }

让我感到困惑的是,在对话框关闭后我仍然可以读取DataContext。我如何确保卸载对话框或者我必须依赖垃圾收集器

2 个答案:

答案 0 :(得分:1)

DataContext是一个任意对象。在您的情况下,通过调用 ServiceLocator.Current.GetInstance()解决了这个问题。当对话框在屏幕上关闭时,表示其DataContext的对象仍在您显示的代码的范围内。

这很有用,因为它允许您在该对话框中执行某些操作,然后在其终止时,提取一些在对话框中“设置”的数据(就像您使用 ReportName SelectedSite 属性)。

一旦保存对 INewReportViewModel 的引用的对话框超出范围(例如,退出创建对话框的方法),就可以假设它已“消失”并且GC会处理它。

答案 1 :(得分:0)

对话框没有从内存中删除,因为你有一个对它的引用,因此垃圾收集器不会删除它。

完成后,您可以为nrDialog分配null,但您仍然会依赖垃圾收集器。