Обычный способ добиться этого - использовать DataTemplates. В основном у вас есть свойство в модели основного представления, содержащее модели представления вашей дочерней страницы:
public object PageViewModel {get; set;} // <--- needs property change notification
Я использовал object
в качестве типа здесь, тогда как на практике у вас обычно есть некоторый базовый класс для ваши страницы.
В вашем представлении вы создаете ContentControl и привязываете его к этому свойству:
<ContentControl Content="{Binding PageViewModel}" />
Наконец, вам нужно указать какое-то отображение, указывающее, какое представление отображать для каждого из них. посмотреть тип модели. Вот где появляются шаблоны данных:
<DataTemplate DataType="{x:Type local:ChildViewModel1}">
<local:ChildViewControl1 />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ChildViewModel2}">
<local:ChildViewControl2 />
</DataTemplate>
Еще один способ добиться этого - через триггеры данных. Они помещаются в родительский стиль и проверяют каждое возможное значение, устанавливая содержимое явно:
<DataTrigger Binding="{Binding PageViewModelProperty}" Value="SomeChildViewModel1Value">
<Setter Property="Template" Value="{StaticResource MyPageTemplate1}" />
</DataTrigger>
<DataTrigger Binding="{Binding PageViewModelProperty}" Value="SomeChildViewModel2Value">
<Setter Property="Template" Value="{StaticResource MyPageTemplate2}" />
</DataTrigger>
... и так далее. Это лучше подходит в тех случаях, когда у вас может не быть отдельного типа класса для каждого из ваших типов страниц, например, в случае страницы, содержащей контент, который генерируется динамически.