2017-07-26 9 views
0

ビューモデルのコマンドにボタンが付いています。このボタンは、リストビューで現在選択されている行を削除するので、続行する前に確認のメッセージボックスを表示します。ユーザがOKボタンをクリックすると(メッセージボックス内)、コマンドが実行されます。そうでない場合は、ユーザクリックのキャンセルボタンコマンドが呼び出されていません。出来ますか?もしそうなら、どのように?ボタンに添付されたコマンドが実行される前のMVVM show confirmation messageboxが実行されました

<Button Name="btnDelete" Command="{Binding DeleteRowsCommand}"/> 

別の可能性プロパティの値がtrueの場合、このカスタムメッセージボックスが表示されるように、ビューに配置されたカスタムメッセージボックスに接続されているプロパティを介してクリックで、ビューモデルにコマンドを呼び出すことです。しかし、「OK」または「キャンセル」ボタンが押されたビューモデルにどのように送り返すことができますか?

+0

あなたのアプローチは面倒ですが、それほど良くありません。いくつかのMessageBoxを試してください – Ramankingdom

+0

'Click'のeventHandlerで' MessageBox'を使い、ViewModelのCommandを使ってvm.DeleteRowsCommand.Execute(someObjectIfYouNeedIt)のように実行してください。 – XAMlMAX

答えて

1

だけMessageBoxを使用しています。この

var result = MessageBox.Show("message", "caption", MessageBoxButton.YesNo, MessageBoxImage.Question); 

if (result == MessageBoxResult.Yes) 
{ 
    //your logic 
} 

DeleteRowsCommand使用にルーティングされる方法で)

は、より多くの情報のためMessageBox Classを見てください。

+3

これは、ViewModelアセンブリにPresentationFramework.dllを追加するため、VMのビューについて何も知りたくありません。 – XAMlMAX

+0

@ XAMlMAXはい、これはviewmodelから 'MessageBox'を表示するでしょう。はい、これに問題はありません。 viewmodelの 'MessageBox'を上げることなく、いくつかの方法がありますが、正直言って、ナットをクラックさせるためにスレッジハンマーを使わないでください。 'MessageBox'を使ってコードをテストしたいのであれば、このコードをインターフェイスに入れたクラスに入れて、テストの中に入れてください。 –

+0

Clickイベントのイベントハンドラを使用すると、 'MessageBox'は必ずしもスレッジハンマーを使用してナットをクラックさせることを意味しません。 – XAMlMAX

0

これを行う方法の1つは、DialogServiceのようなサービスを実装してViewModelに注入し、コマンドが実行されたときに呼び出すことです。これにより、ビューとアプリケーションのロジックを切り離すことができ、ViewModelはダイアログの実際の表示方法を完全に知らず、すべての作業をサービスに委任します。ここに例があります。

まずあなたがダイアログを表示し、その結果を返すのすべての作業を処理し、ダイアログサービスの作成:次に、あなたはViewModelににそのサービス上のあなたのViewModelには依存させるとinjectそれ

public interface IDialogService 
{ 
    bool ConfirmDialog(string message); 
} 

public bool ConfirmDialog(string message) 
{ 
    MessageBoxResult result = MessageBox.Show(message, "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question); 
    return result == MessageBoxResult.Yes ? true : false; 
} 

を:

public class MyViewModel : ViewModelBase 
{ 
    private readonly IDialogService _dialogService; 

    public MyViewModel(IDialogService dialogService) 
    { 
     _dialogService = dialogService; 
    } 
} 

最後に、コマンドでサービスを呼び出して、ユーザーがレコードを削除するかどうかを絶対に確認するかどうかを確認します。

public Command DeleteRecordsCommand 
{ 
    get 
    { 
     if (_deleteRecordsCommand == null) 
     { 
      _deleteRecordsCommand = new Command(
       () => 
       { 
        if (_dialogService.ConfirmDialog("Delete records?")) 
        { 
         // delete records 
        } 
       } 
      ); 
     } 

     return _deleteRecordsCommand; 
    } 
} 
関連する問題