2017-03-03 56 views
1

在我看來,我有:WPF關閉與MVVM從視圖模型類窗口

<Button Grid.Column="2" x:Name="BackBtn" Content="Powrót" Command="{Binding ClickCommand}" Width="100" Margin="10" HorizontalAlignment="Right"/> 

然後,在視圖模型:

public ICommand ClickCommand 
{ 
    get 
    { 

     return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), _canExecute)); 
    } 
} 

private void MyAction() 
{ 
    MainWindow mainWindow = new MainWindow(); // I want to open new window but how to close current? 
    mainWindow.Show(); 
    // how to close old window ? 
} 

namespace FirstWPF 
{ 
    public class CommandHandler : ICommand 
    { 
     private Action _action; 
     private bool _canExecute; 
     public CommandHandler(Action action, bool canExecute) 
     { 
      _action = action; 
      _canExecute = canExecute; 
     } 

     public bool CanExecute(object parameter) 
     { 
      return _canExecute; 
     } 

     public event EventHandler CanExecuteChanged; 

     public void Execute(object parameter) 
     { 
      _action(); 
     } 
    } 
} 

我不知道如何處理這個問題,我想關閉當前窗口窗體ViewModel,因爲我正在打開一個新窗體。

+0

你是否打算在打開新窗口之前說你想調用'Application.Current.MainWindow.Close();'? –

+0

只是一個側面說明 - 說一些「不起作用」是無用的。這可能意味着什麼。你試圖調用Close()(關於什麼對象?)並且它「不起作用」:它是否拋出異常?編譯器是否告訴你它不是你試圖調用它的神祕祕密未知對象的成員?或者是什麼?事情可以以任何方式「不起作用」。說哪個。 –

+0

不起作用意味着什麼也沒有發生 –

回答

5

你可以設計你的窗口採取用來信號關閉請求

public interface ICloseable 
{ 
    event EventHandler CloseRequest; 
} 

public class WindowViewModel : BaseViewModel, ICloseable 
{ 
    public event EventHandler CloseRequest; 
    protected void RaiseCloseRequest() 
    { 
     var handler = CloseRequest; 
     if (handler != null) handler(this, EventArgs.Empty); 
    } 
} 


public partial class MainWindow : Window 
{ 
    public MainWindow(ICloseable context) 
    { 
     InitializeComponent(); 
     context.CloseRequest += (s, e) => this.Close(); 
    } 
} 
+0

我肯定是針對簡單的解決方案 –

+1

@mike_plü想要將你的代碼從你的用戶界面中解耦出來,這樣他們就不會彼此瞭解(MVVM)...這是一個非常簡潔的解決方案... –

+0

如何在我的代碼中調用以關閉我的窗口? –

0

這一問題已經在這些論壇上回答過很多次上下文對象。

在我看來,最乾淨的解決方案是一個附加屬性,如最受好評的答案概述了this question