NavigateAsync не перемещается при внедрении модели представления

Весь день я звоню

await this.NavigationService.NavigateAsync(typeof(Views.MyStankView));

И все отлично работает. До тех пор, пока я не привяжу нажатие кнопки к другой модели представления, которая наследуется от (MVVM-Light) ViewModelBase и (Template10) INavigable, у которой есть метод

public async Task NavigateToMyStankView(object sender, RoutedEventArgs e)
{
    await this.NavigationService.NavigateAsync(typeof(Views.MyStankView));
}

Призыв к

await this.NavigationService.NavigateAsync(typeof(Views.MyStankView));

казнят, но я никуда не ухожу. Изнутри этой модели представления и ее родителя ни OnNavigatingFrom не вызывается. Ни ошибок, ни навигации.

Что дает? Почему NavigateAsync привязанной/внедренной модели представления не перемещается? В то время как «жесткая» модель просмотра действительно перемещается?

РЕДАКТИРОВАТЬ: после дальнейшего изучения this.NavigationService имеет значение null?!? Почему так?


person Maelstrom    schedule 28.10.2016    source источник
comment
Не подлежит ответу таким образом. Создайте минимально воспроизводимый пример   -  person Henk Holterman    schedule 29.10.2016
comment
Ваш класс App в App.xaml.cs наследуется от Bootstrapper?   -  person Tóth Tibor    schedule 30.10.2016
comment
Возможно, опубликуйте несколько полных кодов или поделитесь базовым образцом, чтобы другие могли его исследовать.   -  person Elvis Xia - MSFT    schedule 31.10.2016


Ответы (1)


Это ожидаемое поведение. Свойство NavigationService вашей модели представления вводится NavigationService во время навигации. Что-то вроде ViewModel.NavigationService = this;. Если вы вводите модель представления, то вы создаете ее, а не NavigationService, поэтому свойство равно null. Но это не конец света. Вы можете легко обойти это, установив свойство NavigationService вашей модели представления самостоятельно, используя значение свойства из основной модели представления в качестве источника. Что-то вроде этого var vm = new MyViewModel { NavigationService = this.NavigationService, Dispatcher = this.Dispatcher };.

Хорошее эмпирическое правило заключается в следующем: если свойство NavigationService равно null, вы не сможете перемещаться по нему. ;-) Просто дразню. Я надеюсь, что этот обходной путь имеет смысл.

Удачи.

person Jerry Nixon    schedule 31.10.2016
comment
Спасибо за ответ, Джерри. Вы имеете в виду вот так? await this.NavigationService.NavigateAsync(typeof(Views.MyStankView), new MyStankViewModel { NavigationService = this.NavigationService}); что приводит к этой (очень уместной) ошибке: Сообщение: в mscorlib.ni.dll произошло необработанное исключение типа «System.StackOverflowException». - person Maelstrom; 02.11.2016