WPF之使用IOC+ContentControl实现基于MVVM的导航效果

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值