2016-04-07 10 views
0

Xamarin.FormsにAzure Active Directory B2Cを実装しようとしています。私がそれらの例をコピーすれば、問題なく動作させることができます。しかし、私がプリズムを使用しようとすると、私は問題にぶつかります。ページが最初にロードされるときにViewModelのOnNavigatedToが起動しない

私は、XAMLの分離コードに座っていたこのコードを取った:

protected override async void OnAppearing() 
{ 
    base.OnAppearing(); 
    App.PCApplication.PlatformParameters = platformParameters; 

    try { 
     var ar = await App.PCApplication.AcquireTokenSilentAsync(
      AuthenticationInfo.Scopes, string.Empty, AuthenticationInfo.Authority, 
      AuthenticationInfo.SignUpSignInpolicy, false); 

     AuthenticationInfo.UserAuthentication = ar; 
    } catch {    
    } 
} 

async void OnSignUpSignIn(object sender, EventArgs e) 
{ 
    try { 
     var ar = await App.PCApplication.AcquireTokenAsync(
      AuthenticationInfo.Scopes, string.Empty, UiOptions.SelectAccount, 
      string.Empty, null, AuthenticationInfo.Authority, 
      AuthenticationInfo.SignUpSignInpolicy); 

     AuthenticationInfo.UserAuthentication = ar; 
    } catch (Exception ex) { 
     if (ex != null) { 
     }    
    } 
} 

をとのViewModelのOnNavigatedToにそれを移動:

public async void OnNavigatedTo (NavigationParameters parameters) 
     { 
      if (parameters.ContainsKey ("title")) 
       Title = (string)parameters ["title"]; 

      listen2asmr.App.PCApplication.PlatformParameters = platformParameters; 

      try { 
       var ar = await listen2asmr.App.PCApplication.AcquireTokenSilentAsync(
        AuthenticationInfo.Scopes, string.Empty, AuthenticationInfo.Authority, 
        AuthenticationInfo.SignUpSignInpolicy, false); 

       AuthenticationInfo.UserAuthentication = ar; 
      } catch { 

      } 
     } 

これはブートストラップである:

protected override Xamarin.Forms.Page CreateMainPage() 
     { 
      return Container.Resolve<LoginPage>(); 
     } 

     protected override void RegisterTypes() 
     { 
      Container.RegisterTypeForNavigation<LoginPage>(); 
     } 

OnNavigated Toは決して呼び出されないようです。私が使用しなければならない他の方法がいくつかありますか?私が考えることができる唯一の他のものは、ViewModelコンストラクタからOnNavigatedToのコードを呼び出すことでしたが、async/awaitはコンストラクタで動作します。

+0

来る私は現在、非常に似た何かをしようとしています。あなたの提案されたソリューションは機能しましたか?ロジックをビュー・モデルにどのようにコピーするのかを理解する上での問題として、これを言います。 – whiskeycoder

答えて

1

これは、Xamarin.Formsの最新のプレビュー版で修正されています。代わりに、これらのパッケージを使用してみてください:

https://www.nuget.org/packages/Prism.Forms/6.1.0-pre4 https://www.nuget.org/packages/Prism.Unity.Forms/6.2.0-pre4

また、ブートストラッププロセスが変更されました。詳細については、これを読む:

0

私のアドバイスは、があなたののViewModelためをトリガーとしてあなたビューイベントを使用しています。例えば

View.xaml.cs

protected override async void OnAppearing() { 
    base.OnAppearing(); 
    viewModel.OnAppearing(); 
} 

async void OnSignUpSignIn(object sender, EventArgs e) { 
    viewModel.OnSignUpSignIn(sender, e); 
} 

ViewModel.cs

protected override async void OnAppearing() { 
    App.PCApplication.PlatformParameters = platformParameters; 

    try { 
     var ar = await App.PCApplication.AcquireTokenSilentAsync(
      AuthenticationInfo.Scopes, string.Empty, 
      AuthenticationInfo.Authority, 
      AuthenticationInfo.SignUpSignInpolicy, false); 

     AuthenticationInfo.UserAuthentication = ar; 
    } catch {    
    } 
} 

async void OnSignUpSignIn(object sender, EventArgs e) { 
    try { 
     var ar = await App.PCApplication.AcquireTokenAsync(
      AuthenticationInfo.Scopes, string.Empty, 
      UiOptions.SelectAccount, 
      string.Empty, null, AuthenticationInfo.Authority, 
      AuthenticationInfo.SignUpSignInpolicy); 

     AuthenticationInfo.UserAuthentication = ar; 
    } catch (Exception ex) { 
     if (ex != null) { 
     }    
    } 
} 

理由:

  1. ビューのみビジュアルを関与させるべきである、とそのあなたのページが受け取るイベント。ロジックは、情報の表現(例えば、2つの選択肢のトグル・ボックスを使用するロジック、3+のコンボ・ボックスを使用するロジックなど)を扱わない限り、ViewModelに転送する必要があります。

  2. 「View State」とは対照的に、ViewModelは「モデル状態」(たとえば、支払い情報を入力する必要があるなど)を追跡する必要があります(ユーザーが支払いにナビゲートしたページ)。

関連する問題