编程语言
首页 > 编程语言> > c#-如何使用MVVM指示灯处理WP 8.1上的后退按钮?

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