2012-01-27 3 views
0

Im мало знают о том, как работает ShowDialogРазгрузки Диалога в WPF

Im делает этот

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 после того, как диалоговое окно было закрыто. Как я могу убедиться, что диалог выгружен или мне приходится полагаться на сборщик мусора.

ответ

1

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

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

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

+0

Спасибо, что не знаю, как я пропустил это – klashagelqvist

0

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

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

Смежные вопросы