Xamarin Forms for Unityのナビゲーションのためにビューのインスタンスを登録し、そのインスタンスにナビゲートするときに関連付けられたビューモデルでOnNavigatedToを受け取りたいとします。ナビゲーションのためのインスタンスを登録する箱から出してサポート登録ではありませんので、私は、次の拡張機能を作成しました:Xamarinフォームのユニティでのナビゲーションのためのインスタンスの登録
this.Container.RegisterInstanceForNavigation<AwesomeView, AwesomeViewModel>(
new AwesomeView(),
"seriouslyAnAwesomeView")
:私のapp.xaml.csで
public static void RegisterInstanceForNavigation<TView, TViewModel>(this IUnityContainer container, TView instance, string name = null)
where TView : Page
where TViewModel : class
{
if (string.IsNullOrWhiteSpace(name))
{
name = typeof(TView).Name;
}
ViewModelLocationProvider.Register(typeof(TView).ToString(), typeof(TViewModel));
PageNavigationRegistry.Register(name, typeof(TView));
container.RegisterInstance(typeof(object), name, instance, new ContainerControlledLifetimeManager());
}
を、RegisterTypes、私は、ナビゲーション用のページを登録します
これは部分的に機能するようです。私はページのインスタンスを作成し、それを名前で登録してそれにナビゲートすることができます。最初のナビゲーションでは、INavigationAwareからの対応するビューモデルのOnNavigatedToが呼び出されます。ただし、その後のページのナビゲーションでは、OnNavigatedToは呼び出されません。
この登録は有効ですか?もしそうなら、なぜOnNavigatedToを呼び出さないのですか?そうでない場合、インスタンスはどのようにしてナビゲーションに登録できますか?
プリズムページを追加すると自動的にナビゲーションに登録されます(Xamarin.Forms上) –
@EstebanVerbel、Xamarinフォームのプリズムが自動的にナビゲーション用のビューを登録するとは思わないので、RegisterTypeForNavigation 。ただし、ビューのビューモデルをオートワイヤリングするので、プリズムを含める必要はありません。ビューXAMLにViewModelLocator.AutowireViewModel = "True"。しかし、これがインスタンスへの登録とナビゲートにどのように関連しているかについてもう少し説明してください(ここでは重要なインスタンス)。 – Adam
Visual StudioでTools/Extensions and Updatesにアクセスし、Prism Template Packを検索してインストールすると、すべてが処理されます。新しい「プリズムページ」を追加するたびに、ViewModelが自動的に作成され、RegisterTypes()というオーバーライドメソッドのAppクラスの登録が自動的に作成されます。 –