Выгрузка диалога в WPF - PullRequest
0 голосов
/ 27 января 2012

Я немного неуверен в том, как работает 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 ]

1 голос
/ 27 января 2012

DataContext - произвольный объект. В вашем случае это все, что разрешается вызовом ServiceLocator.Current.GetInstance () . Когда диалоговое окно закрывается на вашем экране, объект, представляющий его DataContext, все еще находится в области видимости кода, который вы показали.

Это полезно, потому что оно позволяет вам что-то делать в этом диалоговом окне, а затем, после его завершения, извлекать некоторые данные, которые были «установлены» в диалоговом окне (так же, как вы делаете с ReportName и SelectedSite свойства).

Как только диалоговое окно, содержащее ссылку на INewReportViewModel , выходит из области видимости (например, при выходе из метода, в котором создается диалоговое окно), вы можете предположить, что оно «ушло» и GC справиться с этим.

0 голосов
/ 27 января 2012

Диалог не удаляется из памяти, потому что у вас есть ссылка на него, и поэтому сборщик мусора не удалит его.

Вы можете присвоить null nrDialog после того, как с ним покончено, но вы все равно будете полагаться на сборщик мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...