WPF родительско-дочернее окно: проблема привязки ссылки - PullRequest
1 голос
/ 21 мая 2010

У меня есть окно WPF, которое открывает модальное дочернее окно для загрузки некоторых данных. Оба окна имеют собственную модель просмотра, теперь у меня есть такая проблема: после закрытия дочернего окна оно, похоже, продолжает работать в фоновом режиме!

Чтобы закрыть дочернее окно, я установил DialogResult из команды viewmodel; теперь, если я создаю новые данные, а затем редактирую их из родительского окна (ранее дочернее окно было закрыто), дочернее окно все еще захватывает событие измененного свойства для свойств, которые ранее связывались.

Как этого избежать?

Я бы очистил каждую ссылку с данными при закрытии модального окна. Какая лучшая практика для этого?

1 Ответ

3 голосов
/ 21 мая 2010

Убедитесь, что вы не сохраняете никаких ссылок на ваше окно, даже косвенных. Одной из наиболее распространенных причин утечек являются события. Если окно B добавляет обработчик события к событию окна A, B не будет освобожден до тех пор, пока не будет также A.

Например, если вы напрямую слушаете изменения свойств, вам следует использовать шаблон слабых событий и заменить все ваши + = вызовом PropertyChangedEventManager .AddListener. В общем, каждый сильный обработчик, который вы добавляете в событие, должен быть удален, чтобы избежать утечки.

Подробнее о утечках в .NET в этой статье MSDN .

Вы можете использовать профилировщик памяти, такой как мем-профилировщик Scitech или Jetbrains dotTrace, чтобы увидеть, какие объекты хранят ваши окна в памяти.


Редактировать: В ответ на ваши комментарии ваш случай действительно проще, чем я думал: сборщик мусора просто еще не собрал окно. Добавление GC.Collect к Test_Click в целях тестирования решает проблему.

Здесь удалите событие SelectionChanged из ComboBox, когда форма закрывается, чтобы вы могли позволить GC выполнить свою работу и вернуть форму позже без проблем. Если вам действительно нужна вся форма для выпуска прямо сейчас, вы можете позвонить по номеру GC.Collect, хотя вам следует избегать ее, когда это возможно.

Редактировать 2: В ответ на ваш третий комментарий это должно иметь значение только для объектов, которые являются общими для представлений, и где изменения в представлении изменят что-то обратно в общем объекте. В вашем тестовом проекте SelectionChanged ничего не делает в исходном списке, поэтому не имеет значения, было ли событие инициировано или нет. Форма будет собрана в конце концов.

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