Начали изучать разработку UWP, создав приложение Windows Template Studio с горизонтальной навигацией тип проекта , MVVM Light шаблон проектирования и две пустые страницы (MainPage и StatsPage).
В главной странице у меня есть список элементов, и я хочу показать статистику выбранного элемента в StatsPage, когда пользователь нажимает соответствующую NavigationViewItem
. В моих приложениях wpf я установил бы RelayCommand
с параметром команды для кнопки в главном представлении, а в модели представления, вызвал метод команды с параметром / arg, чтобы открыть представление Stats с правильной информацией. В созданном приложении Template Studio NavigationViewItem
в ShellPage вызывает OnItemInvoked()
в своей виртуальной машине, которая не знает о выборе в представлении MainPage.
<winui:NavigationView.MenuItems>
<winui:NavigationViewItem x:Uid="Shell_Main" helpers:NavHelper.NavigateTo="LG_Ess.ViewModels.MainViewModel" />
<winui:NavigationViewItem x:Uid="Shell_Stats" helpers:NavHelper.NavigateTo="LG_Ess.ViewModels.StatsViewModel" />
</winui:NavigationView.MenuItems>
<i:Interaction.Behaviors>
<ic:EventTriggerBehavior EventName="ItemInvoked">
<ic:InvokeCommandAction Command="{x:Bind ViewModel.ItemInvokedCommand}" />
</ic:EventTriggerBehavior>
</i:Interaction.Behaviors>
Как передать выбранный элемент MainPage в качестве параметра StatsPage через ShellPage NavigationViewItem
? Я мог бы, вероятно, решить это, добавив кнопку на мою MainPage и скрыв навигацию по Shell, но я бы предпочел сделать это в стиле Template Studio.
Дальнейшие исследования показывают, что ShellViewModel, по-видимому, является DataContext по умолчанию для всех страниц, созданных Template Studio. На своих страницах я установил контекст данных для автоматически сгенерированных моделей просмотра, добавив:
<Page.DataContext>
<local:{PageName}ViewModel/>
</Page.DataContext>
Так что, похоже, я могу либо иметь одну ViewModel и обрабатывать страницы как UserControls, либо отображать DataContext для каждой страницы в свой собственный ViewModel, а также выполнять танец ViewModelLocator для доступа к свойствам из одной виртуальной машины в другой.