8

シェルウィンドウのさまざまなビューの VM 状態の管理と、モーダルまたは非モーダルの多数の編集ダイアログの VM 状態と、ウィンドウ自体の状態を切り替えるのに苦労しました。

ここで、1 つのシェル ウィンドウでやり直して、ダイアログ ウィンドウが 1 つだけであることを望みます。そうすれば、ウィンドウと VM の結合がはるかに少なくなり、シェルの VM 管理パターンをダイアログの管理に借用できます。

ポップアップやあまり一般化されていない非モーダルを直接管理するためのガイダンスはかなり多く見られますが、1 つのダイアログのみを使用してさまざまな VM をホストするための確立されたパターンやガイダンスはありますか? さらに良いことに、すでに Prism で利用可能なそのような機能はありますか?

私は本当に DRY の原則を守りたいと思っています。ビューと VM の両方での継承は、最初のイテレーションの迅速なプロトタイプであると思われるものでは余裕のない複雑さを追加しています。

4

2 に答える 2

5

すぐに使えるソリューションについてはわかりませんが、このような再利用可能なダイアログの実装を作成することはそれほど難しくありません。実は、私は数年前にこのようなことを実装しました。それは別の仕事だったので、もうコードにアクセスすることはできません。さらに、すべての詳細を思い出すことはできませんが、そのような実装の基本的なアイデアを提供することはできます。

DialogVm一般的なダイアログ機能を提供する を作成できます。

まず、プレゼンテーション層のダイアログには何が必要ですか? 通常、3 つのボタンのように...

  • 適用キャンセル閉じる(変更ダイアログ)
  • [ OK ]と[キャンセル]または[はい]と[いいえ] (質問ダイアログ)
  • OK(メッセージボックスの場合)

ご覧のとおり、3 つのコマンド ( ICommand doc ) が必要です。実際、私は実装を作成しました(これDelegateCommandに基づいて)。バインドされたボタンが無効か有効かを決定します。コマンドが null の場合、ボタンは非表示にする必要があります。ICommand.CanExecute

(正しいレイアウト コントロールを使用している場合、ボタンが表示されていなくても、ボタンの位置は適切に調整されます)。

上記の 4 つ以上のシナリオをサポートするために、CommandTitleプロパティをに追加しDelegateCommandて、ボタンのコンテンツがそこから取得されるようにしました。

Title次に、ダイアログのタイトルのプロパティが必要になります。これを に追加しDialogVmます。

Windowコマンドを実行してダイアログを閉じることができるようにしたい場合 (の子である場合にのみ必要)、このアプローチに従うことができます。もちろん、私はそこで説明したバージョンを使用しました。しかし、他のものも有望に見えます。

最後のオープン ポイントは、さまざまなダイアログの内容を表すプロパティです。私の記憶が正しければ、ビュー モデルの小さなセットとそれに対応するDataTemplates(そしてもちろんTemplateSelector、VM の種類に基づいて適切なテンプレートを提供する ) を使用しました。もちろん、によって提供されるContentPresenterを表示しているダイアログにもコントロールが必要です。DataTemplateTemplateSelector

これは唯一のダウンサイトです。いくつかの異なるダイアログ タイプ (質問ボックス、メッセージ ボックスなど) しかない場合、これは良いアプローチです。

使い方はとても簡単です。単純に、目的のロジックであるDialogContentVmDialogVmを使用してインスタンスを初期化し(どのように呼び出したい場合でも)、それをDialogWindowに渡し(おそらく、フライアウトなどの sth. 別のものを使用する必要があります)、ユーザーに提示します。ICommand

それが役立つことを願っています。さらに詳しい情報やヘルプが必要な場合は、お知らせください。

于 2017-01-04T14:27:39.617 に答える
3

これは実際には非常に単純ですが、いくつか複雑な点があります。まず、カスタム ダイアログ サービスを作成します。このサービスは、必要に応じて単純にも複雑にもできます。このサービスが行う主なことは、独自のシェルとして扱われるダイアログを表示することです。ダイアログは同じですが、ダイアログ内の内容は、呼び出し時に渡す情報に基づいて異なります。SO これは、独自の領域を持つカスタム ダイアログを意味します。ダイアログ シェルでさまざまなビューを使用して処理するには、ナビゲーション サービスを利用します。

ダイアログは次のようになります。

public interface IDialogService
{
    void ShowDialog(string uri);
}

public class DialogService : IDialogService
{
    private readonly IUnityContainer _container;
    private readonly IRegionManager _regionManager;

    public DialogService(IUnityContainer container, IRegionManager regionManager)
    {
        _container = container;
        _regionManager = regionManager;
    }

    public void ShowDialog(string uri)
    {
        var dialog = _container.Resolve<DialogShell>();
        //use a scoped region just in case you can have multiple instances
        var scopedRegion = _regionManager.CreateRegionManager();
        //set the region manager of the dialog to the scoped region
        RegionManager.SetRegionManager(dialog, scopedRegion);
        //navigate to show the desired view in the dialog
        scopedRegion.RequestNavigate(KnownRegionNames.ContentRegion, uri);
        //show the dialog
        dialog.Show();
    }
}

このアプローチを変更してニーズに正確に合わせることができますが、アイデアは得られます。

編集:また、ダイアログ内に独自の個別のナビゲーションを持ち、表示される各インスタンスに固有のものを使用できるようにすることで、これに夢中になることさえできることにも言及したいと思います。興味があれば、これを行う方法を示す Pluralsight コースがあります。https://www.pluralsight.com/courses/prism-showing-multiple-shells

于 2017-01-11T19:09:20.100 に答える