Я пытаюсь выучить MVVM и наткнулся на странную загадку. У меня есть главное меню с выдвижным ящиком, которое выходит и показывает меню:
В главном окне, где находится этот ящик, у меня есть ContentControl
, где я устанавливаю его содержимое с помощью Binding.
<ContentControl x:Name="MainWindowContentControl" Content="{Binding Path=WindowContent}"/>
Для этого окна привязана модель представления.
<Window.DataContext>
<viewmodels:MainWindowViewModel/>
</Window.DataContext>
а вот ViewModel:
MainWindowViewModel.cs
public class MainWindowViewModel: ViewModelBase
{
private object _content;
public object WindowContent
{
get { return _content; }
set
{
_content = value;
RaisePropertyChanged(nameof(WindowContent));
}
}
public ICommand SetWindowContent { get; set; }
public MainWindowViewModel()
{
SetWindowContent = new ChangeWindowContentCommand(this);
}
}
Пока что до этого момента все работает нормально. Так, например, если я нажимаю «Операции восстановления», я получаю это:
RecoveryOperationsView.xaml
В " RecoveryOperationsView.xaml " (что является UserControl
) я также ссылаюсь на модель вида сверху, как это ..
<UserControl.DataContext>
<viewmodels:MainWindowViewModel/>
</UserControl.DataContext>
и иметь кнопку для вызова команды для изменения свойства Content ContentControl
из главного окна ..
<Button Grid.Row="2" Content="Restore Database" Width="150" Style="{StaticResource MaterialDesignFlatButton}" Command="{Binding SetWindowContent}" CommandParameter="DatabaseRecovery" >
В моем классе для обработки команд я изменяю содержимое на основе переданного параметра, используя оператор switch, например:
ChangeWindowContentCommand.cs
public class ChangeWindowContentCommand : ICommand
{
private MainWindowViewModel viewModel;
public ChangeWindowContentCommand(MainWindowViewModel vm)
{
this.viewModel = vm;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
switch (parameter)
{
case "Home":
viewModel.WindowContent = new HomeView();
break;
case "RecoveryOps":
viewModel.WindowContent = new RecoveryOperationsView();
break;
case "DatabaseRecovery":
viewModel.WindowContent = new DatabaseRestoreView();
break;
}
}
}
Однако именно здесь я теряюсь ... Если я щелкну что-нибудь в этом новом окне, скажу «Восстановить базу данных» и осмотрю его с точкой останова, я вижу изменяемое свойство, но фактическое ContentControl
Свойство содержимого не меняется на новый UserControl
, который я сделал ... Я могу изменить содержимое с помощью чего угодно в ящике, но если я попытаюсь нажать кнопку в размещенном Содержании ContentControl
, то ничего не изменится. Чего мне не хватает?