2016-03-21 12 views
4

İptal düğmesi (veya sağ üst köşede X veya Esc) tıklandıktan sonra belirli bir formdan çıkmayı nasıl iptal edebilirim?MVVM WPF uygulamasında pencere kapanışı nasıl iptal edilir

WPF:

<Window 
    ... 
    x:Class="MyApp.MyView" 
    ... 
/> 
    <Button Content="Cancel" Command="{Binding CancelCommand}" IsCancel="True"/> 
</Window> 

ViewModel:

public class MyViewModel : Screen { 
    private CancelCommand cancelCommand; 
    public CancelCommand CancelCommand { 
    get { return cancelCommand; } 
    } 
    public MyViewModel() { 
    cancelCommand = new CancelCommand(this); 
    } 
} 

public class CancelCommand : ICommand { 

    public CancelCommand(MyViewModel viewModel) { 
    this.viewModel = viewModel; 
    } 

    public override void Execute(object parameter) { 
    if (true) { // here is a real condition 
     MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
     "Really close?", "Warning", 
     System.Windows.MessageBoxButton.YesNo); 
     if (messageBoxResult == MessageBoxResult.No) { return; } 
    } 
    viewModel.TryClose(false); 
    } 

    public override bool CanExecute(object parameter) { 
    return true; 
    } 
} 

Güncel kod çalışmaz. Açılır pencerede 'Hayır' seçeneğini seçerse, kullanıcının mevcut formda kalmasını istiyorum. Ayrıca, CanExecute geçersiz kılma yardımcı olmuyor. Sadece düğmeyi devre dışı bırakır. Kullanıcının düğmeye basmasına izin vermek istiyorum, ancak sonra onu bilgilendirin, bu veriler kaybolur. Belki bir olay dinleyicisini düğmeye atamalıyım?

DÜZENLEME:

Ben İptal düğmesi popup'ların gösteren yönetilebilir. Ama hala Esc veya X düğmesini (sağ üst) yönetemiyorum. Ben İptal düğmesi ile kafam karışmış görünüyor, çünkü X düğmesini veya Esc'yi tıklattığımda Execute yöntemi çalıştırılıyor.

EDIT2:

Soruyu değişti. 'İptal butonu nasıl iptal edildi'. Ancak, aradığım şey değildi. Esc veya X düğmesini iptal etmem gerekiyor. In 'MyViewModel' ı ekleyin:

 protected override void OnViewAttached(object view, object context) { 
      base.OnViewAttached(view, context); 
      (view as MyView).Closing += MyViewModel_Closing; 
     } 

     void MyViewModel_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
      if (true) { 
       MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
        "Really close?", "Warning", 
        System.Windows.MessageBoxButton.YesNo); 
       if (messageBoxResult == MessageBoxResult.No) { 
        e.Cancel = true; 
       } 
      } 
     } 

Bu sorunumu çözdü. Ancak, hangi tuşa tıklandığını, Kaydet veya İptal edildiğini anlamak için ICommand'a ihtiyacım var. Etkinliğin kullanımını ortadan kaldırmak için herhangi bir yolu var mı?

+3

senin 'viewModel.TryClose (yanlış)' işlevi iletişim kutusunu kapatmak için görünümünüze bir olay gönderir mu? Eğer öyleyse 'IsCancel =" true "' xaml kodundan kaldırabilirsiniz. Bu bölüm formun kapanmasına neden olur. –

+0

@ qqww2 IsCancel = "true" öğesini kaldırırsam Esc'i tıklatırsam pencereyi kapatmaz. Pencerenin Esc'de kapatılmasını istiyorum. –

+1

Komutunuza 'KeyBinding 'kaydedin. [İşte] (http://stackoverflow.com/questions/19697106/create-key-binding-in-wpf) bir örnektir. –

cevap

4

View'ın çalışmalarını ViewModel sınıfında yapmaya çalışıyorsunuz. Görünüm sınıfınızın kapanış isteğini işleme almasını ve iptal edilmesinin gerekip gerekmediğini belirtin.

Bir pencerenin kapanmasını iptal etmek için Closing olayına abone olabilir ve değerini MessageBox gösterdikten sonra true değerine ayarlayabilirsiniz.

<Window 
    ... 
    x:Class="MyApp.MyView" 
    Closing="OnClosing" 
    ... 
/> 
</Window> 

Kod arkasında: Burada

bir örnektir

private void OnClosing(object sender, CancelEventArgs e) 
{ 
    MessageBoxResult result = MessageBox.Show("Really close?", "Warning", MessageBoxButton.YesNo); 
    if (result != MessageBoxResult.Yes) 
    { 
     e.Cancel = true; 
    } 

    bool shouldClose = ((MyViewModel) DataContext).TryClose(false); 
    if(!shouldClose) 
    { 
     e.Cancel = true; 
    } 
} 
+0

Burada sorun, View'un kapatılıp kapatılmayacağını bilmemesidir. ViewModel verilerine nasıl erişebileceğimi bilmiyorum. –

+0

Tamam. Pencereyi kapatmak için algoritmanın ne olduğunu detaylı olarak açıklayabilir misiniz? –

+0

ViewModel'da işleyiciyi OnClosing'e eşit olarak atarım. EDIT2'den sonra söylediğim gibi. Ancak, bu durumda NASIL otu kapattığını ayırt edemiyorum. Yani, ICommand'da ayarlayacağım ek bayraklar eklemeden. –