将查看代码背后的身份验证逻辑迁移到Prism.forms

时间:2016-11-19 12:08:13

标签: azure mvvm xamarin.forms prism

我正在使用Xamarin Forms实现Azure B2C,我想实现azure已经发布的一些教程,除了使用Prism提供的MVVM架构。

我不介意Xamarin Forms框架我更喜欢棱镜导航,PageDialog和事件功能。

我的问题是我很难将代码从View Code迁移到Prism ViewModel。

我想到的一个想法是,如果有一种方法可以使用我们已经在后面的代码中的xaml定义中引用的视图模型,那么我们可以调用相关的导航命令,同时仍然利用代码中的示例代码后面。

但是我对这个框架还是比较陌生的,我怀疑这种方法可能不是最好的。

这是我想要描述的一个例子: 我们从后面的代码中使用OnAppearing方法而不是使用表单导航我希望从视图模型中使用InaviagtionService

protected override async void OnAppearing()
    {
        try
        {
            PublicClientApplication publicClientApplication = new PublicClientApplication(AuthParameters.Authority, AuthParameters.ClientId);
            var authResult = await publicClientApplication.AcquireTokenSilentAsync(AuthParameters.Scopes, "", AuthParameters.Authority, AuthParameters.Policy, false);

            await Navigation.PushAsync(new MainPage());

        }
        catch
        {

        }
    }

而不是使用它:

await Navigation.PushAsync(new MainPage());

这样的事情:

await Viewmodel._navigationService.NavigateAsync("MainPage");

感谢您阅读:)

1 个答案:

答案 0 :(得分:1)

首先,你需要在ViewModel中公开一个公共方法,它会为你调用navigationService

让它像

public async Task NavigateToMainAsync
{
    await _navigationService.NavigateAsync("MainPage");
}

下一步是在后面的代码中公开你的ViewModel,你可以从后面的代码中的构造函数那样做。这里的关键字是 BindingContext

private readonly MyPageViewModel _viewModel;
public MyPage()
{
  InitializeComponent();
  _viewModel = (MyPageViewModel)BindingContext;
}

然后您可以根据需要使用_viewModel。 我不会公开navigationService本身因为我认为它会很难看