WPF MVVM在Window Close上调用ViewModel Save方法

时间:2010-06-28 07:41:05

标签: wpf events mvvm viewmodel

我已经想出如何从我的ViewModel关闭Window。

现在我需要解决另一方面的窗口关闭问题。

当用户单击窗口的关闭按钮时,我需要在我的ViewModel中触发Save()方法。

我在考虑将Command属性绑定到Window的close事件,但我的ViewModel与用户控件有关,在这种情况下,不会执行Close命令。

我也在考虑这个问题Disposing WPF User Controls,但我担心在Dispose方法中调用Save方法有点太晚了。

有什么方法可以解决这个问题吗?

非常感谢你!

2 个答案:

答案 0 :(得分:3)

如果您总是需要在结束时保存,为什么不从ViewModel中的Close()方法而不是View中调用Save()方法?然后确保窗口仅从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 :(得分:1)

我认为最好的解决方案是在您控制的事件中注册ViewModel,该事件也会在您关闭的窗口事件中注册。这样你也可以在windowClosed Event中注册其他ViewModel,以便在其他ViewModels中引发其他save()方法