0

以下に示すモックアップに似た WPF/prism アプリケーションがあります。

レイアウト

両方の TabControl には個別の Prism 領域が含まれており、2 番目の領域は最初の領域にネストされています。ツールバーは、現在アクティブなビューに応じてアイテムをアクティブ化/非アクティブ化する必要があります。

ツールバーは現在、シェルで定義されています。

各ViewModelがサポートするツールバーコマンドを登録できる、ある種のレジストリを使用してみました。ただし、ツールバーはどのビュー(したがってどのビューモデル)がアクティブかを認識できないことに気付きました。

問題はネスティングにあります。それがなければ、TabControl.SelectedItem プロパティをツールバーにバインドし、上からレジストリを使用することで、おそらく目的を達成できます。

多分これを行うためのより良い方法がありますか?または、アクティブなビューをツールバーに認識させる方法はありますか?

編集:この記事で説明されているように、ActiveAware ViewModels を使用しようとしました: http://www.codeproject.com/Articles/56826/ViewModel-Active-Awareness-in-a-Prism-Based-Applic、しかし、私は今持っていますTab "One" から Tab "Two" に切り替えて元に戻すと、ネストされたタブの "First Tab" GotFocus イベントが発生しないという問題が発生しました。つまり、ツールバーが間違ったビューを表すことになります。

多分これは行く方法ですか?

編集 2:問題は、2 番目のタブコントロールが独自のスコープ領域内にないことです。ViewDiscovery アプローチを使用してリージョンにビューを追加しているため、スコープ内にリージョン マネージャーを明示的に作成していません。ビューを切り替えると最初のタブコントロールのビューモデルが正しく更新されるため、SyncActiveState はスコープ領域でのみ機能するようです。

XAML を使用して、通常の領域の代わりにスコープ領域を作成する方法はありますか?

4

3 に答える 3

1

ここでの問題は、ツールバーがアクティブな領域について何も認識していないことです。それらは意図的に分離されています。

私は (個人的に) Event Aggregatorを使用してアクティブな ViewModel からメッセージを発行し、「現在アクティブです」と伝え、ツールバーにそれらのメッセージをサブスクライブさせ、必要に応じてボタンを更新します。

于 2012-07-25T00:56:58.080 に答える
0

これを行おうとすると、使用可能な各ツールバーアクションのブールプロパティとアクション自体のICommandを持つIToolbarManagerを作成する可能性があります。

次に、boolプロパティがコマンドのCanExecute値を変更する具象型でこのインターフェイスを実装し、CommandManager.InvalidRequerySuggestedを呼び出します。このタイプをコンテナにシングルトンとして登録し、DIを使用して各ビューとシェルに挿入します。次に、シェルはツールバーボタンをIToolbarManagerのコマンドにデータバインドでき、ビューは、アクションが初期化されるときにアクションを有効にするかどうかを設定できます。

これをどのように解決するかを考えているだけなので、コードサンプルはありませんが、私が提案していることを理解していただければ幸いです。

于 2012-07-25T00:34:02.620 に答える
0

最終的に、SelectionChanged イベントを使用して、特定のインターフェイスを実装するすべてのアイテムに IsActive を設定する拡張された TabControl を作成しました。また、VisualTree をたどり、拡張された TabControl を見つけて、これらのアイテムに対して同じことを行います。

ここではかなりうまく機能します。これまでのところ、TabControls のみを使用しているため、このソリューションは私にとってはうまくいきます。

于 2012-07-26T13:10:31.853 に答える