これのビットは意見とスタイルです。. . これが私のアプローチです:
質問1:
確認を処理するユーティリティ クラスがあり、MVVM Light の軽量メッセージングを使用して、ビュー、確認、およびビューモデル間の通信を処理します。
編集:ポイント1に関するもう少し情報
コマンド内から、「ConfirmDeletionMessage」の行に沿ってメッセージを送信します。これは、ダイアログ ユーティリティ クラスによって取得されます。ダイアログ ユーティリティ クラスは、適切なメッセージをユーザーに表示し、結果を確認します。結果に基づいて、「DeletionConfirmedMessage」または「DeletionCanceledMessage」をブロードキャストし、ViewModel によって処理されて、削除を完了するかキャンセルします。
このメッセージに複数のサブスクライバーがいる場合、それらがどの順序で処理されるかわからないため、リスクが伴いますが、メッセージ コンシューマーを厳密に管理している場合、またはコンシューマで実行できることを確認している場合ランダムな順序で、このアプローチは非常にうまく機能し、ビューとモデルのコードをテスト可能な方法で分離します。
質問2:
これは難しい問題であり、アプリケーション全体に依存します。私は個人的にアイテムのビューモデルに入れるのが好きです。そうすれば、3 番目の質問についてそれほど心配する必要はありません。代わりに、削除アクションは、扱っているアイテムに対して機能するだけです。 ただし、リスト アイテムの外部にあるデータを操作する必要がある場合 (リストから削除するなど)、親ビューモデルにコマンドを配置する方が理にかなっています。
質問 3:
プロパティを使用しCommandParameter
ます。これを好きなようにバインドできます。
回答#2への編集
Mark Green (以下にコメントした人) は私に考えさせました。私はもともとこのアプローチを WP7 に採用しましたが、それは私が必要としていたことに完全に適合していました。ただし、絶対に考慮すべき他の方法があります。別のオプションは、ビューモデルで使用できる「確認クラス」です。IoC カーネルを使用している場合、これはコンストラクター/プロパティ インジェクションで簡単に実行できます。または、クラスを取得する他の方法がある場合は、それを行いますが、テストでモックアウトできる方法で行います。次のようになります。
public class ExampleViewmodel : ViewModel
{
private IConfirmDialogManager _dialogManager;
public ExampleViewmodel(IConfirmDialogManager dialog)
{
_dialogManager = dialog;
}
// ... code happens ...
private void DeleteCommand()
{
bool result = _dialogManager.Confirm("Are you sure you want to delete?");
}
}
次のような IConfirmDialogManager インターフェイスを使用します。
public interface IConfirmDialogManager
{
bool Confirm(string message);
}
次に、適切に実装します。