Как избавиться от динамически загруженных пользовательских контроллеров / моделей представления, когда родительское окно закрыто

У нас есть главное окно, которое запускает дочернее окно. Это дочернее окно динамически загружает пользовательские элементы управления. В конструкторе этих пользовательских контроллеров я передаю главный объект, который из этого главного объекта генерирует конкретную пользовательскую модель управления и назначается в качестве его текстового контекста.

Все это работает довольно хорошо. Однако я обнаружил, что когда я закрываю дочернее окно, по крайней мере, некоторые из моих пользовательских пользовательских контролов все еще активны. Как я должен очистить мои элементы управления /viewmodels? Кажется, ничего не вызывается, пока главное окно не закроется. Нет деструктора, нет Dispatcher.ShutdownStarted, нет удаления, нет события закрытия, я ничего не могу найти.

Кто-нибудь знает, что нужно сделать, чтобы правильно убрать после закрытия окна?

1 ответ

Я считаю, что вам нужно точно подумать о том, что отвечает за создание ваших представлений и ваших моделей представления, и что отвечает за определение, может ли что-то закрыться или нет, и т. Д.

Обычно это хорошая идея для всего, что создало что-то, чтобы уничтожить это. Поэтому, если ваше дочернее окно создает пользовательские элементы управления, возможно, оно должно отвечать за их удаление. Тем не менее, я считаю, что если ни один из ваших объектов не имеет ссылки (или подписки на сильные события), он должен в конечном итоге быть собранным мусором. Вы можете реализовать финализатор / деструктор и вывести Debug.String в окно вывода, чтобы увидеть, когда это может в конечном итоге произойти. Хороший профиль памяти также может быть хорошей идеей. Однако также вероятно, что вам нужно более точное управление сообщением вашей ViewModel, когда он был закрыт.

Трудно сказать, что именно должно произойти в вашем сценарии, потому что это действительно зависит от вашей конкретной и конкретной настройки. Позвольте мне описать вам сценарий, который был у меня в приложении. У меня было несколько просмотров, которые отображались на вкладках. На страницах вкладок была кнопка X, чтобы закрыть вкладку, а мой просмотр содержал размещенный элемент управления Windows Forms, который должен был вызывать.Dispose() для очистки ресурсов, а также должен был быть информирован о том, когда отписываться от составных команд в система меню файлов. Итак, изначально у меня была проблема... как моя ViewModel отписывается от команд, когда вкладки удаляют это представление? Как View, содержащийся в элементе управления WPF, узнает, когда он был удален? вот что я придумал

  1. Сама вкладка не должна сообщать моей программе, может ли представление закрываться или не закрываться.
  2. Мне нужна была возможность отменить событие закрытия в случае логики программы (Файл сохранен? Да / нет / отменить)
  3. Мне нужна была возможность определять, когда он был закрыт, чтобы я мог очистить / отменить регистрацию в тот самый момент

Мое решение состояло в том, чтобы реализовать интерфейс в моей модели представления, названный IRemovable, который выставил логический Removable и метод Remove(), который возвращает логическое значение (был удален или нет). Мой элемент управления вкладкой отображал кнопку X только в том случае, если для параметра Removable было значение true, при закрытии элемента управления вкладкой функция Remove() объекта IRemovable ViewModel запускалась, а если он возвращал значение false, для свойства args Canceled было установлено значение true, если параметр ViewModel Remove возвращал значение false.

Поэтому удаление модели представления может запрашивать у пользователя подтверждение, отмену регистрации в командах и т. Д. Представление может обрабатывать закрытое событие и вызывать Dispose для любых компонентов Windows Forms и т. Д. (Конечно, я должен был проверить, является ли мой View.DataContext IRemovable).

Во всяком случае, я знаю, что это не точный ответ, но, надеюсь, это поможет вам придумать некоторые мысли о том, как решить вашу собственную проблему

Другие вопросы по тегам