2010-06-28 84 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(); 
    } 
}