Как правильно указать DataContext в UserControl MVVM?

Есть такой код в 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'ах?
  • Вопрос задан
  • 848 просмотров
Решения вопроса 1
FoggyFinder
@FoggyFinder
Проблема не с назначением DataContext для UserControl. Для связывания команды с кнопкой используется свойство Command а не Click:

<Button Command="{Binding OpenDataBaseEditorView}">Open</Button>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы