WPF之使用IOC+ContentControl实现基于MVVM的导航效果
WPF自带的有Fram实现的导航,但是这是基于view的,这里实现了MVVM的基于viewModel的导航。
1.自定义NavigationService
自己写一个NavigationServie来动态获取页面或者控件,为了使后台页面发生变化时前台能够动态刷新,需要自定义一个事件来通知
public class NavigationService
{
//当前显示的页面
private ViewModelBase? currentViewModel;
//通知前台拿到这个页面的事件
public event Action? CurrentViewModelChanged;
public ViewModelBase? CurrentViewModel
{
get => currentViewModel;
set
{
currentViewModel = value;
CurrentViewModelChanged?.Invoke();
}
}
//导航方法
public void NavigateTo<T>() where T : ViewModelBase
{
//这里是从IOC容器中获取到页面
CurrentViewModel = App.Provider.GetService<T>();
}
}
在这个导航方法中使用泛型来获取页面,使用时只需要传入页面类型即可
2.IOC中添加所需的页面
在App.cs文件中定义一个IOC容器,然后将所需的页面或者控件传入容器中,方便使用。
//定义一个获取服务的接口
public static IServiceProvider Provider { get; set; }
public static new App Current => (App)App.Current;
public App()
{
//定义一个容器,然后添加页面和服务
var container = new ServiceCollection();
container.AddSingleton<MainWindow>();
container.AddSingleton<MainWindowViewModel>();
//这是数据类,用于页面之间传输数据
container.AddSingleton<DataService>();
container.AddSingleton<NavigationService>();
container.AddTransient<HomeControl>();
container.AddTransient<HomeControlViewModel>();
Provider = container.BuildServiceProvider();
}
//重写启动方法,注意在xaml中删除掉starturi
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
//获取容器中的类
MainWindow = Provider.GetService<MainWindow>();
MainWindow.Show();
}
3.设置Mainwinow
在window中定义一个viewModel来获取页面
public part