Когда я не использую Prism
или Dependency Injection
, я обычно использую первый подход View Model.
В этом сценарии у нас есть свойство в нашей Windows ViewModel, которое является классом, от которого наследуются другие UserControls
ViewModels, обычно просто используется класс ViewModelBase, который имеет имплиментацию INotifyPropertyChanged
:
private ViewModelBase currentViewModel;
public ViewModelBase CurrentViewModel
{
get { return currentViewModel; }
set { currentViewModel = value; NotifyPropertyChanged(); }
}
Теперь внутри вашего MainWindow
, как @Tomtom сказал, что у вас ContentControl
привязано к этому свойству. Это означает, что при использовании DataTemplates
у вас может быть другое отображение View в зависимости от того, какой тип ViewModel в данный момент находится в этом свойстве.
<Window.Resources>
<DataTemplate DataType="{x:Type viewmodels:ViewModel1}">
<views:View1/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodels:ViewModel2}">
<views:View2/>
</DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding CurrentViewModel}"/>
С этим на месте все, что вам нужно сделать, это иметь некоторую логику, которая изменяет ViewModel на MainWindow
ViewModel, и View обновится, чтобы отобразить правильный View для этой ViewModel.
Редактировать: Следует отметить, что существует множество различных способов, которыми люди используют для достижения того, что вы хотите, ни один из них не является действительно правильным или неправильным, но все они соответствуют потребностям разных людей и стилям кодирования.