簡體   English   中英

如何使用MVVM光處理WP 8.1上的后退按鈕?

[英]How to handle the back button on WP 8.1 using MVVM light?

我正在尋找適當的方式來使用MVVM light 5上提供的NavigationService來處理Windows Phone 8.1 WinRT上的后退按鈕事件。

到目前為止,我認為最好的方法是在ViewModelLocator內部注冊NavigationServiceGoBack方法,同時按照MVVM Light V5NavigationService中概述的方法創建它。

這是一種有效的方法。 但是,在導航之前我無法處理驗證,因此我想知道是否有更合適的方法來處理此事件。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM