Мне нравится использовать платформу Prism, однако я считаю, что их Области следует использовать только для макета приложения (MenuRegion
, NavigationRegion
, ContentRegion
и т. Д.), А не для навигации.Использование их для навигации означает, что View позволяет управлять потоком приложений, и я считаю, что это работа для ViewModels.
Мой предпочтительный метод отображения изменяющегося содержимого - это DataTemplates и ContentControls
.что-то, как вы обрисовали в общих чертах, у меня будет родительский ViewModel, который содержит
ObservableCollection<IPageViewModel> PageViewModels
IPageViewModel SelectedPageViewModel
Область, которую я хотел отобразитьдинамический контент будет использовать ContentControl, такой как это:
<ContentControl Content="{Binding SelectedPage" />
И DataTemplates будут использоваться для указания WPF, как рисовать каждый раздел
<DataTemplate TargetType="{x:Type local:Page1ViewModel}">
<local:Page1View />
</DataTemplate>
<DataTemplate TargetType="{x:Type local:Page2ViewModel}">
<local:Page2View />
</DataTemplate>
<DataTemplate TargetType="{x:Type local:Page3ViewModel}">
<local:Page3View />
</DataTemplate>
Я не использовал RibbonBar раньше, однакопохоже, что он должен учитывать ItemSource, поэтому ваш окончательный XAML должен выглядеть примерно так:
<Window>
<Grid>
<DockPanel>
<RibbonBar ItemsSource="{Binding PageViewModels}"
SelectedItem="{Binding SelectedPageViewModel}"
DockPanel.Dock="Top" ...>
</RibbonBar>
<StackPanel>
<Grid>
... Generic Content
</Grid>
<ContentControl Content="{Binding SelectedPageViewModel}">
<ContentControl.Resources>
<DataTemplate TargetType="{x:Type local:Page1ViewModel}">
<local:Page1View />
</DataTemplate>
<DataTemplate TargetType="{x:Type local:Page2ViewModel}">
<local:Page2View />
</DataTemplate>
<DataTemplate TargetType="{x:Type local:Page3ViewModel}">
<local:Page3View />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</StackPanel>
</DockPanel>
</Grid>
</Window>