c# - 如何使用 MVVM light 处理 WP 8.1 上的后退按钮?

标签 c# mvvm windows-phone-8.1 winrt-xaml mvvm-light

我正在寻找合适的方法来使用 MVVM light 5 上可用的 NavigationService 处理 Windows Phone 8.1 WinRT 上的后退按钮按下事件。

到目前为止,我认为最好的做法是在 ViewModelLocator 中注册 NavigationServiceGoBack 方法,同时在下面创建它NavigationService in MVVM Light V5 中概述的方法

这是一种有效的方法。但是,我无法在返回之前处理验证,所以我想知道是否有更合适的方法来处理此事件。

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 接口(interface)以及 Activate 和 Deactivate 方法。您可以使用 AllowGoingBack 方法扩展该 INavigable 接口(interface),如下所示:

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。

关于c# - 如何使用 MVVM light 处理 WP 8.1 上的后退按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28119593/

相关文章:

c# - 使用 Linq 合并来自两个来源的数据的更好方法

c# - 如何在使用 Excel 文件导出文件时在 C# 中使用数据注释验证

c# - 将 ViewModel 连接到模型

c# - 对象引用未设置到对象实例,在 WPF 设计器中,位于 x :Reference

wpf - WPF如何在XAML主页面中使用包含数据模板的资源字典

c# - 如何在 WP8.1 应用程序中使用反射获取命名空间中的所有类?

sqlite - 在Windows Phone 8.1上使用SQLite-是否需要ORM?

c# - 创建通用 LINQ 函数以返回传入的类型

windows-phone-8.1 - 如何知道指定的路径是否引用了现有文件?

c# - 如何使用 UIMap Coded UI Test Builder 进行本地测试