我在我的应用程序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本身不处理事件。
答案 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>
最诚挚的问候