我正在使用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");
感谢您阅读:)
答案 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本身因为我认为它会很难看