Мне кажется, я нашел ответ на свой первоначальный вопрос, в дополнение к тому, который был поднят в обсуждении моих комментариев с flq.
Во-первых, ответ на первоначальный вопрос заключается в том, что правильный способ закрыть окно - это то же, что я делал в описанном мной «обходном пути». Закрытие приложения - это процесс, инициируемый View, поскольку именно элемент управления Window имеет биты для того, как это сделать. Конечно, вы можете перехватить событие Application.Exit, чтобы выполнить очистку ваших ViewModels, предложить пользователю сохранить данные и т. Д.
Вопрос, поднятый мной после некоторого интересного обсуждения с flq, заключается в том, что если я просто не установлю DataContext
элемента управления (т. Е. ViewModel) в значение null, чтобы освободить ресурсы View и ViewModel, как мне это сделать?
Интересное обсуждение с некоторыми нюансами можно найти здесь , но основной ответ заключается в том, что вы нашли родительский элемент управления и удалили элемент управления, который хотите закрыть, из его списка детей. Обратите внимание, что это другой метод с другой целью, чем просто сделать элемент управления невидимым, установив для свойства Visibility значение Collapsed. В следующем примере «this» - это удаляемый элемент управления (т. Е. «Closed»):
Panel p = (Panel) this.Parent;
p.Children.Remove(this);
Я не уверен, что вам все еще нужно установить потомок (т. Е. «This») в null, чтобы повторно запросить его ресурсы, или, если простое удаление его из визуального дерева, заставит WPF повторно запросить Ресурсы; вышеупомянутое связанное обсуждение не упоминает. Как упомянуто в исходном обсуждении , вышеупомянутая техника может быть дополнена путем привязки ее к определенным событиям или использования другой логики, специфичной для приложения.