将身份验证逻辑从视图代码隐藏迁移到 Prism.forms 中的 ViewModel
Migrating Authenitciation Logic from the View Code Behind to the ViewModel in Prism.forms
我正在使用 Xamarin Forms 实现 Azure B2C,我想实现 azure 发布的一些教程,除了使用 Prism 提供的 MVVM 架构。
我不介意 Xamarin Forms 框架,我只是更喜欢棱镜导航、PageDialog 和事件功能。
我的问题是我很难将代码从后面的视图代码迁移到 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");
感谢阅读:)
首先,您需要在 ViewModel 中公开一个 public 方法,该方法会为您调用导航服务
让它像
public async Task NavigateToMainAsync
{
await _navigationService.NavigateAsync("MainPage");
}
下一步是在后台代码中公开您的 ViewModel,您可以从后台代码中的构造函数中执行此操作。这里的关键字是BindingContext
private readonly MyPageViewModel _viewModel;
public MyPage()
{
InitializeComponent();
_viewModel = (MyPageViewModel)BindingContext;
}
然后你就可以随意使用_viewModel了。
我不会公开 navigationService 本身,因为我认为它会很丑
我正在使用 Xamarin Forms 实现 Azure B2C,我想实现 azure 发布的一些教程,除了使用 Prism 提供的 MVVM 架构。
我不介意 Xamarin Forms 框架,我只是更喜欢棱镜导航、PageDialog 和事件功能。
我的问题是我很难将代码从后面的视图代码迁移到 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");
感谢阅读:)
首先,您需要在 ViewModel 中公开一个 public 方法,该方法会为您调用导航服务
让它像
public async Task NavigateToMainAsync
{
await _navigationService.NavigateAsync("MainPage");
}
下一步是在后台代码中公开您的 ViewModel,您可以从后台代码中的构造函数中执行此操作。这里的关键字是BindingContext
private readonly MyPageViewModel _viewModel;
public MyPage()
{
InitializeComponent();
_viewModel = (MyPageViewModel)BindingContext;
}
然后你就可以随意使用_viewModel了。 我不会公开 navigationService 本身,因为我认为它会很丑