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;