Обработка кнопки закрытия «X» в WPF под MVVM - PullRequest
3 голосов
/ 03 июля 2010

Я создаю базовое приложение базы данных в WPF и начал использовать шаблон MVVM.

У меня есть диалоговое окно, в котором пользователю предлагается выбрать элемент из ListBox и нажать «ОК». После этого я беру элемент, выбранный пользователем из свойства в модели представления, и передаю его в другое диалоговое окно. Но если пользователь нажимает «Отмена», я устанавливаю это значение на null, и действие отменяется: я не открываю следующий диалог и не возвращаюсь к главному экрану. Пример:

public class SelectEquipmentViewModel : WorkspaceViewModel
{
    private bool _selected;

    public Equipment SelectedEquipment
    {
        // Item selected by the user
    }

    // Action for "SelectCommand," which is attached to
    // the "Select" button in the view
    public void ExecuteSelect()
    {
        _selected = true;

        // Fires a RequestClose event in WorkspaceViewModel,
        // which is attached to the view's Close method
        RequestClose();
    }

    public override void RequestClose()
    {
        if (!_selected)
        {
            // The user clicked "Cancel"
            SelectedEquipment = null;
        }

        base.RequestClose();
    }
}

Это прекрасно работает, но проблема возникает, если пользователь нажимает красную кнопку закрытия "X" в окне управления окна. Метод RequestClose никогда не вызывается, и для выбранного элемента не установлено значение null, что плохо.

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

Каков «предпочтительный» способ справиться с этой ситуацией?

Спасибо.

Ответы [ 3 ]

1 голос
/ 03 июля 2010

Я думаю, что использование поведения EventToCommand для подключения события Closing объекта Window к новой команде ExecuteCancel довольно чисто.

public void ExecuteCancel() 
{ 
    _selected = false; 

    // Fires a RequestClose event in WorkspaceViewModel, 
    // which is attached to the view's Close method 
    RequestClose(); 
}

Как вы думаете, где это будет грязно? Если вы добавите кнопку «Отмена», она может использовать те же биты ExecuteCancel ...

0 голосов
/ 07 августа 2012

Подход без дополнительных зависимостей описан в статье Обработка событий закрытия и закрытия окна в View-Model и код с предоставленным примером. Это не добавляет код позади xaml.

(благодаря ссылке Рида Копси )

0 голосов
/ 03 июля 2010

Поведения - это то, что вы хотите использовать для выполнения команды, когда пользователь нажимает кнопку «X» в окне, используя MVVM. Посетите блог Рида Копси здесь: http://reedcopsey.com/2009/10/09/using-behaviors-to-allow-the-viewmodel-to-manage-view-lifetime-in-m-v-vm/

Вы можете скачать образец приложения здесь ...

Я все время использую этот метод, чтобы позволить ViewModel управлять жизненным циклом представления.

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