Есть такой код в MainWindow.xaml:
<Window.Resources>
<DataTemplate
DataType="{x:Type vm:MainMenuVM}">
<v:MainMenu />
</DataTemplate>
<DataTemplate
DataType="{x:Type vm:DataBaseEditorVM}">
<v:DataBaseEditor />
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding CurrentContentVM}"/>
RootVM.cs:
public class RootVM : ObservableObject
{
private readonly Dictionary<string, BaseVM> mViewModels = new Dictionary<string, BaseVM>();
private BaseVM mCurrentContentVM;
public BaseVM CurrentContentVM
{
get => mCurrentContentVM;
set
{
mCurrentContentVM = value;
OnPropertyChanged("CurrentVM");
}
}
public RootVM()
{
mViewModels.Add("MainMenu", new MainMenuVM(this));
mViewModels.Add("DataBaseEditor", new DataBaseEditorVM(this));
SetVM("MainMenu");
}
public void SetVM(string vmName)
{
if (mViewModels.ContainsKey(vmName))
{
CurrentContentVM = mViewModels[vmName];
}
}
}
Я удалил StartupUri и создаю MainWindows с контекстом RootVM в App.cs.
new MainWindow { DataContext = RootVM }.Show();
У меня есть ViewModel для MainMenu, в которой есть команда
public Command OpenDataBaseEditorView
{
get => mOpenDataBaseEditorView ??
(mOpenDataBaseEditorView = new Command((o) =>
{
mParentVM.SetVM("DataBaseEditor");
}));
private set { }
}
Соответственно я ожидаю, что мне достаточно повесить её на Button
<Button Click="{Binding OpenDataBaseEditorView}">Open</Button>
в MainMenu.xaml, а контекст будет учтён во время выполнения, ведь указал DataTemplate в MainWindow.xaml. Но возникает ошибка во время выполнения с указанием на эту строчку с кнопкой. Как правильно назначать DataContext UserControl'ам в MVVM? Как в данной ситуации, когда у меня по сути есть только CurrentContentVM в RootVM дать знать о нём во всех UserControl'ах?