2016-12-22 9 views
1

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を呼び出さないのですか?そうでない場合、インスタンスはどのようにしてナビゲーションに登録できますか?

+0

プリズムページを追加すると自動的にナビゲーションに登録されます(Xamarin.Forms上) –

+0

@EstebanVerbel、Xamarinフォームのプリズムが自動的にナビゲーション用のビューを登録するとは思わないので、RegisterTypeForNavigation 。ただし、ビューのビューモデルをオートワイヤリングするので、プリズムを含める必要はありません。ビューXAMLにViewModelLocator.AutowireViewModel = "True"。しかし、これがインスタンスへの登録とナビゲートにどのように関連しているかについてもう少し説明してください(ここでは重要なインスタンス)。 – Adam

+0

Visual StudioでTools/Extensions and Updatesにアクセスし、Prism Template Packを検索してインストールすると、すべてが処理されます。新しい「プリズムページ」を追加するたびに、ViewModelが自動的に作成され、RegisterTypes()というオーバーライドメソッドのAppクラスの登録が自動的に作成されます。 –

答えて

1

ユーザーが戻るボタンを押すと、プリズムはページを破棄してBindingContextの設定を解除します。 Auto-wiringが有効な場合、PrismはBindingContextを作成時に1回だけ設定します。したがって、次回プリズムがあなたのページに移動するとき、バインディングコンテキストはnullであり、OnNaviagedToは決して呼び出されません。

上記のコメントで説明したように、メモリ内のビューを保持することは多少非典型的な動作であり、この動作はPrismによって正式にサポートされていないようです。

つまり、Pageのバインディングコンテキストを手動でリセットすることで、この問題を簡単に解決できます。 PrismはあなたがそうのようなあなたのPageナビゲーションに認識させることができます:

public class MyReusablePage : ContentPage, INavigationAware 
{ 
    ... 

    public void OnNavigatingTo(NavigationParameters parameters) 
    { 
     if (this.BindingContext == null) 
     { 
      this.BindingContext = new MyReusablePageViewModel(); 
     } 
    } 

    ... 
} 

は、新しいビューモデルのインスタンスが最初に作成1つのプリズムと同一でないことを警戒してください。ビューモデルのインスタンスが変更されないようにするには、自動配線(XAMLではAutoWireViewModel="False")を無効にし、独自のシングルトンインスタンスをUnityに登録する必要があります。

関連する問題