Современный пользовательский интерфейс WPF — ручная навигация по страницам (из ViewModel или View\Control\code-behind)

У меня есть приложение MVVM, которое я пытаюсь перевести на современный пользовательский интерфейс, но я не могу понять службу навигации...

По сути, моя ViewModel представляет собой ObservableCollection с методом «AddItem», как ICommand. Когда этот метод выполняется, я хочу вернуться к 1-й ссылке\странице первой группы MUI, вот пример фрагмента современного пользовательского интерфейса 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» (в группе «Открытая работа»).

В идеале я хотел бы сделать это из ViewModel, но я не возражаю против присоединения обработчика к событию CollectionChanged и ручной настройки страницы, но образцы NavigationService (здесь) не помогли мне разобраться...

В крайнем случае я добавил MVVM Light из Nuget и попытался внедрить IModernNavigationService в свою ViewModel, но не могу понять, как заставить ViewModelLocator работать.


person epicTurk    schedule 14.09.2016    source источник


Ответы (1)


Нашел ответ. Гораздо проще, чем я думал. В моем программном коде 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);
            }
        }
    }
person epicTurk    schedule 14.09.2016