Некоторые предложения для вас.
- Создайте класс
MainViewModel
и установите DataContext
из MainWindow
как экземпляр этого. - Если возможно, не Не используйте обработчики событий в MVVM, особенно для событий нажатия кнопок. Вместо этого в MainViewModel создайте свойство типа
ICommand
и привяжите к нему свойство кнопки Command
.
В зависимости от того, какую (библиотеку) вы используете для реализации шаблона MVVM, возможно, у вас уже есть реализация ICommand
, например MVVMLight's
RelayCommand
. Если нет, вы можете использовать базовую реализацию c ICommand, например
public class BasicCommand: ICommand
{
private readonly Action _execute;
public Command(Action execute)
{
_execute = execute;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_execute?.Invoke();
}
public event EventHandler CanExecuteChanged;
}
В MainViewModel создайте свойство типа object ContentViewModel и привяжите к нему свойство Content ContenControl. Это свойство должно реализовывать INotifyPropertyChanged
, поскольку вы собираетесь обновлять его из ViewModel.
В соответствующем методе для команды установите для свойства ContentViewModel соответствующее значение, например экземпляр Window1ViewModel.
В ресурсах ContentControl определите DataTemplate для каждого типа, который вы, возможно, захотите отобразить. Это должно быть основано на чем-то отличном от Window - например, Grid, CustomControl или UserControl.
.
<ContentControl
Margin="8"
Content="{Binding SelectedItem}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:Window1ViewModel}">
<ctrl:Window1Display DataContext="{Binding}" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:Window2ViewModel}">
<ctrl:Window2Display DataContext="{Binding}" />
</DataTemplate>
...
</ContentControl.Resources>
</ContentControl>
Дополнительные сведения и рабочий пример на моя запись в блоге .