私はWPF4.0を開発しています-PRISMフレームワーク(Unity Container)に基づくMVVMアプリケーション。
mvvmパターンでダイアログを実装するための最良の方法は何だろうと思っていました。アプリケーションでかなりの数を使用することを計画しているので、再利用可能なものが必要です。
役立つと思われるMVVMとのダイアログに関するこの記事:http://www.codeproject.com/Articles/36745/Showing-Dialogs-When-Using-the-MVVM-Pattern
Prism / Unityを使用しているので、ビューモデルのメディエーターパターンを実装します。
ViewModelsは、IDialogServiceを使用して必要なダイアログを表示するようになりました。
public interface IDialogService
{
void RegisterDialog (string dialogID, Type type);
bool? ShowDialog (string dialogID);
}
public class DialogService : IDialogService
{
private IUnityContainer m_unityContainer;
private DialogServiceRegistry m_dialogServiceRegistry;
public DialogService(IUnityContainer unityContainer)
{
m_unityContainer = unityContainer;
m_dialogServiceRegistry = new DialogServiceRegistry();
}
public void RegisterDialog(string dialogID, Type type)
{
m_dialogServiceRegistry.RegisterDialog(dialogID, type);
}
public bool? ShowDialog(string dialogID)
{
Type type = m_dialogServiceRegistry[dialogID];
Window window = m_unityContainer.Resolve(type) as Window;
bool? dialogResult = window.ShowDialog();
return dialogResult;
}
}
ビューでViewModelイベントとハンドラーを使用する場合は、WeakEventHandlerパターンを使用して、潜在的なリソースリークを排除します。また、複数のビューを同じViewModelにアタッチすることもできます。私は1つのViewModel->1つのViewでプロジェクトに取り組んできました。しかし、1つのViewModel->複数のビューもあります。設計を決定する際に考慮すべきことです。
ユーザー情報を取得する必要があるときに、ViewModelにイベントを発生させます。それからそれをどのように供給するかはビュー次第です。これは、ファイルの背後にあるコードがイベントハンドラーを取得することを意味しますが、実際のMVVMの熟練者は身震いします...