すぐに使えるソリューションについてはわかりませんが、このような再利用可能なダイアログの実装を作成することはそれほど難しくありません。実は、私は数年前にこのようなことを実装しました。それは別の仕事だったので、もうコードにアクセスすることはできません。さらに、すべての詳細を思い出すことはできませんが、そのような実装の基本的なアイデアを提供することはできます。
DialogVm
一般的なダイアログ機能を提供する を作成できます。
まず、プレゼンテーション層のダイアログには何が必要ですか? 通常、3 つのボタンのように...
- 適用、キャンセル、閉じる(変更ダイアログ)
- [ OK ]と[キャンセル]または[はい]と[いいえ] (質問ダイアログ)
- OK(メッセージボックスの場合)
ご覧のとおり、3 つのコマンド ( ICommand
doc ) が必要です。実際、私は実装を作成しました(これDelegateCommand
に基づいて)。バインドされたボタンが無効か有効かを決定します。コマンドが null の場合、ボタンは非表示にする必要があります。ICommand.CanExecute
(正しいレイアウト コントロールを使用している場合、ボタンが表示されていなくても、ボタンの位置は適切に調整されます)。
上記の 4 つ以上のシナリオをサポートするために、CommandTitle
プロパティをに追加しDelegateCommand
て、ボタンのコンテンツがそこから取得されるようにしました。
Title
次に、ダイアログのタイトルのプロパティが必要になります。これを に追加しDialogVm
ます。
Window
コマンドを実行してダイアログを閉じることができるようにしたい場合 (の子である場合にのみ必要)、このアプローチに従うことができます。もちろん、私はそこで説明したバージョンを使用しました。しかし、他のものも有望に見えます。
最後のオープン ポイントは、さまざまなダイアログの内容を表すプロパティです。私の記憶が正しければ、ビュー モデルの小さなセットとそれに対応するDataTemplates
(そしてもちろんTemplateSelector
、VM の種類に基づいて適切なテンプレートを提供する ) を使用しました。もちろん、によって提供されるContentPresenter
を表示しているダイアログにもコントロールが必要です。DataTemplate
TemplateSelector
これは唯一のダウンサイトです。いくつかの異なるダイアログ タイプ (質問ボックス、メッセージ ボックスなど) しかない場合、これは良いアプローチです。
使い方はとても簡単です。単純に、目的のロジックであるDialogContentVmDialogVm
を使用してインスタンスを初期化し(どのように呼び出したい場合でも)、それをDialogWindowに渡し(おそらく、フライアウトなどの sth. 別のものを使用する必要があります)、ユーザーに提示します。ICommand
それが役立つことを願っています。さらに詳しい情報やヘルプが必要な場合は、お知らせください。