我使用的是在我的应用程序NavigationView主控和具有帧中加载页面。
<NavigationView x:Name="MyNavView" IsBackButtonVisible="Collapsed" SelectionChanged="{x:Bind ViewModel.OnSelectionChanged}" PaneDisplayMode="Top">
<NavigationView.MenuItems>
<NavigationViewItem Icon="Contact" Content="Contact" Tag="MasterDetailPage"/>
<NavigationViewItem Icon="Favorite" Content="Favorites" Tag="FavoritesPage"/>
</NavigationView.MenuItems>
<Frame x:Name="RootFrame"/>
</NavigationView>
还有的SelectionChanged两个事件和ItemInvoked,使可实现导航到加载在RootFrame(我的框架的名称)的页面。但我想用命令使MVVM。而且我还没有发现命令道具甚至NavigationView本身或NavigationViewItem。从那以后,我在视图模型已经处理SelectionChanged事件,但在我看来,它违背MVVM。
那么,如何才能让使用Command MVVM?如果没有这样的机会,告诉如何实现MVVM本身不处理事件。
实现这个是非常相似的,你如何做到这一点的WPF,你需要通过的NuGet安装包Microsoft.Xaml.Behaviors.Uwp.Managed开始。然后添加一个行为,你NavigationView:
xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
<NavigationView MenuItemsSource="{x:Bind ViewModel.MenuItems}">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="ItemInvoked">
<core:EventTriggerBehavior.Actions>
<core:InvokeCommandAction Command="{x:Bind ViewModel.ItemInvokedCommand}" />
</core:EventTriggerBehavior.Actions>
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
我使用x:Bind
这里编译时错误检查,但经常Binding
将工作过程中的一样好。无论哪种方式,在您的视图模型的一个命令处理程序就像你对WPF跟进:
private ICommand _ItemInvokedCommand;
public ICommand ItemInvokedCommand => this._ItemInvokedCommand ?? (this._ItemInvokedCommand = new RelayCommand<NavigationViewItemInvokedEventArgs>(OnItemInvoked));
private void OnItemInvoked(NavigationViewItemInvokedEventArgs args)
{
// could also use a converter on the command parameter if you don't like
// the idea of passing in a NavigationViewItemInvokedEventArgs
this.NavigationService.NavigateTo(args.InvokedItem);
尝试使用Windows Template Studio,它与MVVM结合NavigationView时解决我的问题
为了了解如何正确使用NavigationView控制(包括数据绑定的情况下),请参阅名为XAML的配套应用控件库,可在Windows商店,微软。
最好的祝福