以下是一个使用不同视图/视图模型的WPF主菜单的解决方案。该解决方案包含两个视图(MainMenuView和ContentView)和两个视图模型(MainMenuViewModel和ContentViewModel)。
首先,创建两个视图MainMenuView和ContentView。MainMenuView包含一个菜单和一个内容区域,ContentView用于显示不同的内容。
MainMenuView.xaml:
ContentView.xaml:
然后,创建两个视图模型MainMenuViewModel和ContentViewModel,它们继承自INotifyPropertyChanged
接口。
MainMenuViewModel.cs:
using System.ComponentModel;
using System.Windows.Input;
namespace WpfApp
{
public class MainMenuViewModel : INotifyPropertyChanged
{
private ContentViewModel _currentViewModel;
public ContentViewModel CurrentViewModel
{
get { return _currentViewModel; }
set
{
_currentViewModel = value;
OnPropertyChanged(nameof(CurrentViewModel));
}
}
public ICommand OpenCommand { get; set; }
public ICommand SaveCommand { get; set; }
public MainMenuViewModel()
{
OpenCommand = new RelayCommand(Open);
SaveCommand = new RelayCommand(Save);
CurrentViewModel = new ContentViewModel();
}
private void Open(object obj)
{
CurrentViewModel = new ContentViewModel();
}
private void Save(object obj)
{
// Save logic
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
ContentViewModel.cs:
using System.ComponentModel;
namespace WpfApp
{
public class ContentViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
最后,在App.xaml.cs中设置MainWindow的DataContext为MainMenuViewModel的实例:
using System.Windows;
namespace WpfApp
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainMenuViewModel viewModel = new MainMenuViewModel();
MainMenuView view = new MainMenuView();
view.DataContext = viewModel;
view.Show();
}
}
}
这样,当点击菜单的Open按钮时,将会创建一个新的ContentViewModel实例,并显示在内容区域中。
这是一个基本的示例,你可以根据自己的需求进行扩展和修改。