我不确定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。我如何确保卸载对话框或者我必须依赖垃圾收集器
答案 0 :(得分:1)
DataContext是一个任意对象。在您的情况下,通过调用 ServiceLocator.Current.GetInstance()解决了这个问题。当对话框在屏幕上关闭时,表示其DataContext的对象仍在您显示的代码的范围内。
这很有用,因为它允许您在该对话框中执行某些操作,然后在其终止时,提取一些在对话框中“设置”的数据(就像您使用 ReportName 和 SelectedSite 属性)。
一旦保存对 INewReportViewModel 的引用的对话框超出范围(例如,退出创建对话框的方法),就可以假设它已“消失”并且GC会处理它。
答案 1 :(得分:0)
对话框没有从内存中删除,因为你有一个对它的引用,因此垃圾收集器不会删除它。
完成后,您可以为nrDialog
分配null,但您仍然会依赖垃圾收集器。