Это будет зависеть в некоторой степени от контекста, но часто я использую технику, в которой у меня есть объект (или какой-то абстрактный класс) с именем типа «MainContent» внутри некоторой ViewModel.Это ответственно за удержание контента для отображения в ContentControl
.
Мой XAML будет выглядеть примерно так, где Type1View
и Type2View
будут UserControl
s (vw_Type1
и vw_Type2
являются ссылками на их пространства имен), и затем я бы переключался между ними, устанавливая MainContent
для экземпляра Type1ViewModel
или Type2ViewModel
.
<ContentControl Content="{Binding MainContent}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm_Type1:Type1ViewModel}">
<vw_Type1:Type1View />
</DataTemplate>
<DataTemplate DataType="{x:Type vm_Type2:Type2ViewModel}">
<vw_Type2:Type2View />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
Об этом можно было бы позаботиться, возможно, скнопка (или две кнопки в следующем примере) вне ContentControl
, которая отправляет команду ViewModel, содержащую MainContent
, которая просто изменяет свойство MainContent
, либо на существующий, либо на новый экземпляр Type1ViewModel
или Type2ViewModel
.Например:
private Type1ViewModel _type1ViewModel;
public Type1ViewModel Type1ViewModel
{
get { return _type1ViewModel; }
set
{
if (_type1ViewModel != value)
{
_type1ViewModel = value;
NotifyPropertyChanged();
}
}
}
private Type2ViewModel _type2ViewModel;
public Type2ViewModel Type2ViewModel
{
get { return _type2ViewModel; }
set
{
if (_type2ViewModel != value)
{
_type2ViewModel = value;
NotifyPropertyChanged();
}
}
}
...
private ObservableObject _mainContent;
public ObservableObject MainContent
{
get { return _mainContent; }
set
{
if (_mainContent != value)
{
_mainContent = value;
NotifyPropertyChanged();
}
}
}
...
public InternalDelegateCommand NavigateToType1Command => new InternalDelegateCommand(NavigateToType1);
public InternalDelegateCommand NavigateToType2Command => new InternalDelegateCommand(NavigateToType2);
...
private void NavigateToType1() => MainContent = Type1ViewModel;
private void NavigateToType2() => MainContent = Type2ViewModel;
Итак, чтобы завершить XAML для этого примера:
<Button Content="Type 1" Command="{Binding NavigateToType1Command}" />
<Button Content="Type 2" Command="{Binding NavigateToType2Command}" />
<ContentControl Content="{Binding MainContent}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm_Type1:Type1ViewModel}">
<vw_Type1:Type1View />
</DataTemplate>
<DataTemplate DataType="{x:Type vm_Type2:Type2ViewModel}">
<vw_Type2:Type2View />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
(Информацию по InternalDelegateCommand
см. В моем ответе на этот вопрос .)