使用带有MvvmLight,WinRt的AppBar导航到页面

时间:2014-04-12 20:52:20

标签: c# windows-store-apps mvvm-light

我有一个顶级应用栏客户用户控件,用于在我的WinRt MvvmLight应用程序中导航。此自定义控件已添加到我的所有页面

TopAppBar用户控制

<AppBarButton 
 x:Uid="HomeTopAppBar"
 Command="{Binding HomeCommand}"
 Icon="Home"/>
<AppBarButton 
 x:Uid="LibraryTopAppBar"
 Command="{Binding LibraryCommand}"
 Icon="Library"/>

这些命令被添加到我的所有ViewModel中。例如,

HomeViewModel

public RelayCommand LibraryCommand {
  get {
     return new RelayCommand(
                 () => _navigationService.Navigate(typeof(LibraryPage)));
  }
}

public RelayCommand HomeCommand {
   get {
      return new RelayCommand(
                 () => _navigationService.Navigate(typeof(HomePage)));
   }
}

我遇到的问题是,如果用户使用顶部应用栏,则第一次点击有效(即,用户导航到正确的页面。)在第二次单击时,程序在OnNavigatedFrom上的NavigationHelper中崩溃方法(取自MvvmLight)。程序抱怨_pageKey为null。有什么东西我做错了吗?用户如何从App Bar导航到其他页面?

1 个答案:

答案 0 :(得分:0)

我决定使用点击事件,而不是在我的Appbar中添加命令。之所以这样做是因为通过使用该命令,每个使用我的appbar的viewmodel都需要创建该命令。这是我的解决方案:

<强> TopAppBar.xaml

<AppBarButton 
  x:Uid="HomeTopAppBar"
  Click="AppBarButton_Home"
  Icon="Home"/>
<AppBarButton 
  x:Uid="LibraryTopAppBar"
  Click="AppBarButton_Library"
  Icon="Library"/>

<强> TopAppBar.xaml.cs

private void AppBarButton_Home(object sender, RoutedEventArgs e) {
   SimpleIoc.Default.GetInstance<INavigationService>().Navigate(typeof(HomePage));
}

private void AppBarButton_Library(object sender, RoutedEventArgs e) {
  SimpleIoc.Default.GetInstance<INavigationService>().Navigate(typeof(LibraryPage));
}

从Appbar(例如主页)导航到的任何页面

public sealed partial class HomePage {
  public HomePage() {
     InitializeComponent();
  }

  public HomeViewModel ViewModel {
     get {
        return (HomeViewModel)DataContext;
     }
  }

  //needed for navigation
  protected override void OnNavigatedTo(NavigationEventArgs e) {
     base.OnNavigatedTo(e);
  }

  //needed for navigation
  protected override void OnNavigatedFrom(NavigationEventArgs e) {
     base.OnNavigatedFrom(e);
  }

}