[英]How to handle the back button on WP 8.1 using MVVM light?
我正在尋找適當的方式來使用MVVM light 5上提供的NavigationService
來處理Windows Phone 8.1 WinRT上的后退按鈕事件。
到目前為止,我認為最好的方法是在ViewModelLocator
內部注冊NavigationService
的GoBack
方法,同時按照MVVM Light V5中NavigationService中概述的方法創建它。
這是一種有效的方法。 但是,在導航之前我無法處理驗證,因此我想知道是否有更合適的方法來處理此事件。
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
使用WinRT中的MVVM Light調用ViewModel方法以響應頁面導航事件
你會注意到他使用了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。
根據igrali的回答,並按照WinRT中使用MVVM Light響應頁面導航事件調用ViewModel方法中的說明,我在“BindablePage.cs”類中所做的,在OnNavigatedTo方法中添加以下內容:
HardwareButtons.BackPressed += HardwareButtons_BackPressed;
並在OnNavigatedFrom中:
HardwareButtons.BackPressed -= HardwareButtons_BackPressed;
然后添加事件處理程序:
void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
var navigableViewModel = this.DataContext as INavigable;
if (navigableViewModel != null)
navigableViewModel.BackButonPressed(e);
}
接下來,在INavigable界面中添加
void BackButonPressed(Windows.Phone.UI.Input.BackPressedEventArgs e);
最后,在每個視圖模型上:
public void BackButonPressed(Windows.Phone.UI.Input.BackPressedEventArgs e)
{
// You can modify this code to show a confirmation dialog, etc...
e.Handled = true;
navigationService.GoBack();
}
如果這是一個通用應用程序,那么不要忘記用#if WINDOWS_PHONE_APP ... #endif
包圍這些新代碼#if WINDOWS_PHONE_APP ... #endif
我發現了一篇關於你的問題的有趣文章: http : //blog.falafel.com/windows-phone-and-mvvm-light-navigationservice-and-cangoback/
這是個主意:
public AboutPage()
{
this.InitializeComponent();
HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
var frame = Window.Current.Content as Frame;
if (frame.CanGoBack)
{
var navigation = ServiceLocator.Current.GetInstance<INavigationService>();
navigation.GoBack();
e.Handled = true;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.