首页 > 解决方案 > Mvvm Wpf MaterialDesign 更新 ViewModel 从另一个 ViewModel(抽屉)

问题描述

MVVM 的新手仍在学习。我在 MVVM 上的导航有问题。我想在所有页面上都有一个抽屉,所以我在 MainWindow.xaml 上构建了抽屉。我的问题是当我不在主窗口内时能够绑定 CurrentViewModel。主窗口

  <Grid>
    <controls:Drawer DataContext="{Binding Navigator}"/>
    <ContentControl Content="{Binding Navigator.CurrentViewModel}"/>
  </Grid>

我的导航器绑定到 Drawer.xaml

 <materialDesign:DrawerHost
            IsLeftDrawerOpen="{Binding ElementName=MenuToggleButton, Path=IsChecked}">
                <materialDesign:DrawerHost.LeftDrawerContent>
               <Button Content="Home" Command="{Binding UpdateCurrentViewModelCommand}" CommandParameter="Home"/>
               <Button Content="Admin" Command="{Binding UpdateCurrentViewModelCommand}" CommandParameter="Admin"/>

我的 2 按钮可以完美地更改主视图显示。所以当我点击 Home 或 Admin 时,我有 Home 或 Admin 视图。

我的目标是当我在视图管理员中时能够返回另一个视图。示例:如果您是管理员并创建了一个新用户,我希望在您单击发送后返回主窗口。这是我无法做到的部分。为了更新视图,我创建了这个命令

public class UpdateCurrentViewModelCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

        private INavigator _navigator;

        public UpdateCurrentViewModelCommand(INavigator navigator)
        {
            _navigator = navigator;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
                switch(parameter)
                {
                    case "Home":
                        _navigator.CurrentViewModel = new HomeViewModel();
                        break;
                    case "Admin":
                        _navigator.CurrentViewModel = new AdminViewModel();
                        break;
                    default:
                        break;
                }
            
        }
    } 

这是 INavigator 界面

public interface INavigator
    {
        ViewModelBase CurrentViewModel { get; set; }
        ICommand UpdateCurrentViewModelCommand { get; }
    }

我不知道是否足够清楚以获得帮助。如果不让我知道您还需要什么!谢谢。

编辑

 public class Navigator : INavigator, INotifyPropertyChanged
{
    private ViewModelBase _currentViewModel;
    public ViewModelBase CurrentViewModel
    {
        get
        {
            return _currentViewModel;
        }
        set
        {
            _currentViewModel = value;
            OnPropertyChanged(nameof(CurrentViewModel));
        }
    }

    public ICommand UpdateCurrentViewModelCommand => new UpdateCurrentViewModelCommand(this);

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

}

标签: c#wpfmvvmmaterial-design

解决方案


推荐阅读