2010-06-28 181 views
1

我已经想出了如何从ViewModel关闭窗口。WPF MVVM调用ViewModel窗口关闭的保存方法

现在我需要从另一侧解决窗口关闭问题。

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

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

我在看这个问题以及Disposing WPF User Controls,但是我担心把Dispose方法调用放在Dispose方法中有点太晚了。

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

非常感谢!

回答

1

我认为最好的解决方案是在注册ViewModel的事件中进行控制,该事件也在您关闭的事件窗口中注册。通过这种方式,您还可以在windowClosed事件中注册其他ViewModel,以便在其他ViewModel中引发其他Save()方法

+0

这对我有效....谢谢:) – 2010-06-28 08:00:27

3

如果您总是需要在关闭时保存,为什么不从Close中调用Save()方法)方法在ViewModel中而不是从视图?然后确保该窗口只从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(); 
    } 
}