1

WPF、MVVM、および PRISM 領域を使用してアプリケーションを作成しています。

リージョンごとに 1 つのビュー (A と B) を持つ 2 つのリージョンがあります。次のように、regionmodules クラスのリージョンにビューを追加します。

    // I use the following private properties in both regionmodules.cs class
    private readonly IUnityContainer _container;
    private readonly IRegionManager _regionManager;

--あ--

    private void RegisterViews()
    {
        var controlsView = _container.Resolve<EmulatorControlsView>();
        _regionManager.Regions["ControlsRegion"].Add(controlsView, "A");
    }

--B--

    private void RegisterViews()
    {

        var templatesView = _container.Resolve<TemplatesView>();
        _regionManager.Regions["TemplatesRegion"].Add(templatesView, "B");

        var view = _regionManager.Regions["TemplatesRegion"].GetView("B");
        _regionManager.Regions["TemplatesRegion"].Deactivate(view);
    }

ビュー B は shell.xaml でビュー A をオーバーレイするため、アプリの初期化中にビュー "B" を無効にします。

ビュー A からのクリック コマンドは、次のコードに従ってビュー B をアクティブにし、ビュー A を非アクティブにします。

    private void LoadTemplateExecute()
    {
        var controlView = _regionManager.Regions["ControlsRegion"].GetView("A");
        _regionManager.Regions["ControlsRegion"].Deactivate(controlView);

        var templateView = _regionManager.Regions["TemplatesRegion"].GetView("B");
        _regionManager.Regions["TemplatesRegion"].Activate(templateView);
    }

テンプレート領域ビュー モデルには、ビュー A を非アクティブ化し、ビュー B をアクティブ化する他のボタン コマンドが存在します。

このコードはうまく機能し、オンデマンドでビューを表示できます。

問題: ビュー B には、依存関係プロパティを介してビュー モデルの ObservableCollection にバインドされた ListView があります。現在、ビュー モデル コンストラクターを使用して ObservableCollection に文字列項目を追加しています。

    private void InitializeTemporaryLists()
    {
        TemplateList.Add("Dog");
        TemplateList.Add("Cat");
        TemplateList.Add("Horse");
    }  

ただし、ビュー B がアクティブ化されると、ObservableCollection のリストに項目が表示されません。

質問: ビューがアクティブになったときに通知するために、リージョン ビューまたはビュー モデルで使用できるイベントはありますか?
ビューがアクティブになるたびに、ビュー モデルからビューにデータを入力する最良の方法は何ですか?

アイデアやコード例は大歓迎です!

* 更新 * 私はばかげたプログラマーなので、ListView が更新されませんでした。依存関係プロパティで ObservableCollection<> 型を宣言していませんでした。

しかし、頭の良いプログラマーがプリズム領域ビューのアクティブ化をどのように処理するのか知りたいです。次のようなイベントにサブスクライブできればと思います。

_regionManager.Regions["YourRegion"].OnActiveView() += HandleActiveViewEvent;
4

1 に答える 1

2

IActiveAwareビューがアクティブ化および非アクティブ化されたときに通知を受け取るインターフェースを実装できます。これは、ビューまたはビューモデル (両方ではない) に実装すると、フレームワークによって呼び出されます。

ビューまたはビューモデルの外部からアクティベーション通知が必要な場合は、領域のActiveViewsコレクションの変更を監視することもできます。これにより、インターフェイスがサポートされINotifyCollectionChangedます。

于 2012-08-28T17:20:32.320 に答える