c# - 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));
}
}
}
解决方案
推荐阅读
- mysql - SQL MySQL IN 运算符与表达式不是列
- r - 如何输出多维数组
- app-store - 在 iTunes Connect 中为 iAP 添加新的本地化(语言)是否需要(重新)批准 IAP?
- javascript - 如何在非模块脚本中注入 Webpack DefinePlugin 变量
- python - 只等待python微处理器的第一个响应不是全部
- java - Java编程项目
- c++ - C++20标准会包含C18标准吗
- mongodb - MongoDB在找不到结果时返回格式化对象
- android - 带有 Intent 的 Android 安装 apk 在 Android 10 中不起作用
- azure-devops - AzureDevOps 2019 - 将测试运行链接到用户故事