WPF MVVM вызывает метод ViewModel Сохранить при закрытии окна - PullRequest
2 голосов
/ 28 июня 2010

Я понял, как закрыть Window из моей ViewModel.

Теперь мне нужно решить проблему закрытия окна с другой стороны.

Мне нужно вызвать метод Save () в моемViewModel, когда пользователь нажимает кнопку закрытия окна.

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

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

Есть ли способ решить эту проблему?

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 28 июня 2010

Если вам всегда нужно экономить на закрытии, почему бы не вызвать метод Save () из метода Close () в ViewModel вместо из View?Затем просто убедитесь, что окно закрывается только из ViewModel, а не из самого View.Что-то вроде (не проверено, но вы поняли)

public class SaveOnCloseViewModel
{
    public event Action RequestClose;
    ...
    public void Close()
    {
         Save();
         RequestClose();
    }
}

public class SaveOnCloseView
{
    private SaveOnCloseViewModel _vm;
    public SaveOnCloseView(SaveOnCloseViewModel vm)
    {
        _vm = vm;
        _vm.RequestClose += this.PerformClose;
        this.OnClosing += Window_Closing;
    }

    private bool _isClosing = false;
    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        if (!_isClosing)
        {
            e.Cancel = true;
            _vm.Close();
        }
    }

    private void PerformClose()
    {
        _isClosing = true;
        this.Close();
    }
}

1 голос
/ 28 июня 2010

Я думаю, что лучшим решением для этого было бы зарегистрировать ViewModel в событии под вашим контролем, которое также зарегистрировано в закрытом событии вашего окна. Таким образом, вы можете также зарегистрировать другие ViewModel в событии windowClosed в будущем, чтобы вызывать другие методы save () в других ViewModels

...