c#-如何使用MVVM指示灯处理WP 8.1上的后退按钮?
作者:互联网
我正在寻找使用MVVM light 5上可用的NavigationService在Windows Phone 8.1 WinRT上处理后退按钮按下事件的适当方法.
到目前为止,我认为最好的方法是在ViewModelLocator内部,方法是按照NavigationService in MVVM Light V5中概述的方法注册NavigationService的GoBack方法,同时创建该方法
这是一种有效的方法.但是,我无法在返回之前处理验证,因此我想知道是否有更合适的方法来处理此事件.
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
// Register NavigationService
SimpleIoc.Default.Register(CreateNavigationService);
// Register ViewModels here
}
private INavigationService CreateNavigationService()
{
var navigationService = new NavigationService();
// Register pages here
navigationService.Configure("Details", typeof(DetailsPage));
// Handle back button
HardwareButtons.BackPressed += (sender, args) => {
navigationService.GoBack();
args.Handled = true;
};
return navigationService;
}
}
解决方法:
如果您看一下Marco如何在博客文章中启用OnNavigatedTo和OnNavigatedFrom调用以传播到ViewModel
Calling ViewModel methods in response to Page navigation events using MVVM Light in WinRT
您会注意到他使用了INavigable界面以及Activate和Deactivate方法.您可以使用AllowGoingBack方法扩展该INavigable接口,如下所示:
public interface INavigable
{
void Activate(object parameter);
void Deactivate(object parameter);
bool AllowGoingBack();
}
然后,根据上下文,每个与页面相关的ViewModel可以具有其自己的AllowGoingBack方法的实现.然后,在View的代码后面(可以,因为View可以知道ViewModel),可以重写OnNavigatingFrom并检查是否应允许返回:
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
var navigableViewModel = this.DataContext as INavigable;
if (navigableViewModel != null)
{
if (e.NavigationMode == NavigationMode.Back && !navigableViewModel.AllowGoBack())
{
e.Cancel = true;
}
}
}
然后,您的ViewModel将实现INavigable,因此您将在AllowGoingBack()中定义验证代码,如果返回确定,则返回true,否则返回false.
标签:winrt-xaml,windows-phone-8-1,mvvm-light,c,mvvm 来源: https://codeday.me/bug/20191120/2046819.html