>我在我的应用程序导航视图中用作主控件,并在加载页面时使用了框架。
<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的命令道具。之后,我在ViewModel中处理了SelectionChanged事件,但在我看来它与MVVM相矛盾。
那么,如何使用命令制作 MVVM?如果没有这样的机会,请告诉如何实现 MVVM 本身不处理事件。
实现这一点与为 WPF 执行此操作的方式非常相似,您需要首先通过 NuGet 安装 Microsoft.Xaml.Behaviors.Uwp.Managed 包。然后,将行为添加到导航视图:
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,它解决了我将NavigationView与MVVM结合使用时的问题<</p>
若要了解如何正确使用 NavigationView 控件(包括数据绑定情况),请参阅 Windows 应用商店中提供的名为 XAML 控件库的配套应用,按 Microsoft 提供。
此致敬意