UWP NavigationView通过MVVM导航

时间:2018-12-27 11:43:49

标签: c# mvvm uwp navigation

我在我的应用程序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 (我的框架的名称)中加载的页面。但是我想使用Command制作MVVM。而且我什至没有为 NavigationView 本身或 NavigationViewItem 找到Command道具。之后,我在ViewModel中处理了SelectionChanged事件,但在我看来,这与MVVM相矛盾。

那么,如何使用Command制作MVVM?如果没有这样的机会,请告诉我们如何实现MVVM本身不处理事件。

3 个答案:

答案 0 :(得分:1)

尝试使用Windows Template Studio,当将NavigationView与MVVM结合使用时,它解决了我的问题

答案 1 :(得分:1)

实现此功能与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);

答案 2 :(得分:0)

为了查看如何正确使用NavigationView控件(包括数据绑定用例),请参阅Microsoft Store在Windows Store中提供的名为 XAML Controls Gallery 的配套应用程序。 / p>

最诚挚的问候