现代 UI WPF - 手动页面导航(来自 ViewModel 或 View\Control\code-behind)

Modern UI WPF - Manual Page Navigation (from ViewModel or View\Control\code-behind)

我有一个 MVVM 应用程序,我正在尝试迁移到现代 UI,但我似乎无法弄清楚导航服务...

基本上,我的 ViewModel 是一个带有 "AddItem" 方法的 ObservableCollection,作为 ICommand。执行此方法时,我想切换回第一个 MUI 组的第一个 Link\Page,这里是现代 UI WPF 的示例片段...

<mui:ModernWindow ...>
    <mui:ModernWindow.MenuLinkGroups>
        <mui:LinkGroup DisplayName="Open Work">
            <mui:LinkGroup.Links>
                <mui:Link DisplayName="Current Activity" Source="/Pages/ActivityPage.xaml" />
                <mui:Link DisplayName="Activity Queue" Source="/Pages/Queue.xaml" />
            </mui:LinkGroup.Links>
        </mui:LinkGroup>
        <mui:LinkGroup DisplayName="Search" >
            <mui:LinkGroup.Links>
                <mui:Link DisplayName="Customers" Source="/Pages/SearchPage.xaml" />
            </mui:LinkGroup.Links>
        </mui:LinkGroup>
    </mui:ModernWindow.MenuLinkGroups>

所以基本上,从"SearchPage.xaml"开始,执行了ICommand "AddItem",我想立即切换回"ActivityPage.xaml"(在"Open Work"组)。

理想情况下,我想从 ViewModel 执行此操作,但我不介意将处理程序附加到 CollectionChanged 事件,并手动设置页面,但 NavigationService 示例(here) 没帮我解决这个问题...

作为最后的手段,我从 Nuget 添加了 MVVM Light,并尝试在我的 ViewModel 中实现 IModernNavigationService,但我不知道如何让 ViewModelLocator 工作。

找到答案了。比我想象的要简单得多。 在我的 ModernWindow 代码隐藏中,我将以下处理程序添加到 CollectionChanged 事件:

    private void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if(e.NewItems.Count > 0)
        {
            try
            {
                ContentSource = MenuLinkGroups.First().Links.First().Source;
            }
            catch (Exception error)
            {
                ModernDialog.ShowMessage(error.Message, FirstFloor.ModernUI.Resources.NavigationFailed, MessageBoxButton.OK);
            }
        }
    }