Разгрузить детское окно при закрытии (silverlight mvvm) - PullRequest
0 голосов
/ 26 июля 2011

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

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

Дочернее окно использует ту же модель представления, из которой оно было вызвано, поэтому я думаю, это объясняет, почему запускаются события.Источники элементов по-прежнему действительны.

Но когда оно закрыто, я бы хотел "утилизировать" дочернее окно навсегда.

Я попытался добавить обработчик Closed, как этот (Код представления по умолчанию)позади):

    private void OnLaunchEditItem(ItemMessage msg)
    {
        var editWnd = new EditItemWindow();
        editWnd.Closed += new EventHandler(editWnd_Closed);
        editWnd.Show();
    }

    void editWnd_Closed(object sender, EventArgs e)
    {
        sender = null;
    }

Никаких успехов ..

Итак, что я сейчас делаю, так это удалю источник элементов из дочерних элементов управления, что мне кажется ... не идеальным решениемк проблеме.Должна ли быть возможность избавиться от памяти при закрытии?(Детское окно "view" code-behind)

    private void OKButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
        combobox1.ItemsSource = null;
        combobox2.ItemsSource = null;
    }

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
        combobox1.ItemsSource = null;
        combobox2.ItemsSource = null;
    }

Ответы [ 2 ]

1 голос
/ 30 июля 2011

У обмена сообщениями есть известная проблема, связанная с жесткой связью между мессенджером и получателем сообщения. Поэтому, если вы используете обмен сообщениями, вы должны убедиться, что вызывается метод Messenger.Unregister. Другими словами, когда вы звоните Register для обработки сообщений, убедитесь, что вы также набрали Unregister!

Таким образом, по вашему мнению, вы должны зарегистрироваться для участия в событии Unloaded; тогда вы звоните Messenger.Unregiser(this);, где это ваше мнение.

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

Также см .:

MVVM Light Listener не освобождает / детерминированное завершение зарегистрированного объекта? и MVVM Light Messenger выполняется несколько раз .

Лоран знает об этой проблеме, но - на данный момент - не имеет решения.

0 голосов
/ 26 июля 2011
  1. Совместное использование ViewModels между представлениями может привести к таким проблемам.Вот почему это делается редко.
  2. Модель ViewModel, как правило, не должна интересоваться навигацией, потому что в идеальном мире она даже не должна знать, с каким видом она связана.Это включает порождение дочерних представлений (ChildWindows).

Я бы порекомендовал вам два изменения.Первый - создать отдельную модель представления для вашего диалога.И второе, чтобы отделить навигацию от модели представления, делегировав навигацию контроллеру.Контроллер в MVVM обычно представляет собой одноэлементный объект, цели которого - открывать окна, диалоги и т. Д. Это может быть реализовано с использованием шаблона Event Aggregator довольно элегантным способом.

...