私はPrismにかなり慣れていません。現在、概念実証プロジェクトとしてPrismを使用して、既存のアプリケーションの1つを書き直しています。
アプリケーションは、ViewModelの最初のアプローチでMVVMを使用します。ViewModelはコンテナーによって解決され、IViewResolver
サービスは、(特に名前の規則を使用して)どのビューに接続する必要があるかを判断します。
現時点でのコード(タブコントロールにビューを追加するため)は次のようになります。
var vm = (get ViewModel from somewhere)
IRegion reg = _regionManager.Regions["MainRegion"];
var vw = _viewResolver.FromViewModel(vm); // Spins up a view and sets its DataContext
reg.Add(vw);
reg.Activate(vw);
これはすべて正常に機能しますが、Prismナビゲーションフレームワークを使用してこれらすべてのことを実行し、次のようなことができるようにしたいと思います。
_regionManager.RequestNavigate(
"MainRegion",
new Uri("NameOfMyViewModel", UriKind.Relative)
);
そして、PrismにViewModel + Viewを起動させ、DataContextを設定して、ビューを領域に挿入します。
ViewModelタイプを参照するDataTemplatesを作成することで、ある程度の成功を収めました。例:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Module01">
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestView />
</DataTemplate>
</ResourceDictionary>
...そして、モジュールが初期化されるときに、関連するリソースディクショナリをアプリケーションリソースに追加するようにモジュールに指示しますが、それは少しごみのようです。
Prismからビューの作成を効果的に引き継ぐ方法はありますか?そうすれば、RequestNavigate
呼び出されたときに、提供されたものを見て、Uri
それに基づいてビュー/ビューモデルを起動できますか?あなたが自分でビューを提供することを可能にするデリゲートを必要とする過負荷がありRegionManager.RegisterViewWithRegion
ます、そして私はそのようなものを求めていると思います。
私は自分IRegionBehaviorFactory
で提供する必要があるかもしれないと思いますが、何が関係しているのかわかりません(または私が正しい道を進んでいるとしても!)。
助けていただければ幸いです。
--注:元々はプリズムコードプレックスサイトに投稿されました