wpf-MVVM+IOC/ID

一、简介

  承接上文《WPF-理解与使用MVVM,请勿滥用》;这里讲解 MVVM+IOC/ID 的案例。本文IOT方式参考于《WPF ViewModel打开窗体方法总结 》,这个案例是每次打开一个窗体时都new一个,窗体不是单例;想使用单例窗体可以注入一个。

  代码地址:https://gitee.com/qq28069933146_admin/wpf_mvvm_simple

二、MVVM+IOC/ID案例

1、定义窗口服务接口:

    public interface IWindowService
    {
        void WindowShow<T>(Window owner = null) where T : Window, new();

        void WindowShowDialog<T>(Window owner = null) where T : Window, new();
    }

2、实现服务:

 /// <summary>
 /// 开启窗体
 /// </summary>
 public class WindowService : IWindowService
 {
     /// <summary>
     /// 开启(展示)
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="owner">父窗体</param>
     public void WindowShow<T>(Window owner = null) where T : Window, new()
     {
         var window = new T();
         if (owner != null)
             window.Owner = owner;
         window.Show();
     }

     /// <summary>
     /// 开启(展示)
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="owner">父窗体</param>
     public void WindowShowDialog<T>(Window owner = null) where T : Window, new()
     {
         var window = new T();
         if (owner != null)
             window.Owner = owner;
         window.ShowDialog();
     }
 }

3、注册服务(在App.xaml.cs):

    public partial class App : Application
    {
        public static IServiceProvider Services { get; set; }

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            // 依赖注入
            Services = ServiceCollection();

            this.MainWindow = new MainWindow();
            this.MainWindow?.Show();
        }

        /// <summary>
        /// 注册服务
        /// </summary>
        /// <returns></returns>
        private static IServiceProvider ServiceCollection()
        {
            var service = new ServiceCollection();

            //service.AddTransient<Album>();
            service.AddSingleton<ILogTool, LogTool>();
            service.AddSingleton<IWindowService, WindowService>();

            // ViewModel
            service.AddSingleton<MainViewModel>();
            service.AddSingleton<MsgViewModel>();
            // View
            //service.AddSingleton<MainWindow>(); 
            //service.AddScoped<MsgWindow>();
            return service.BuildServiceProvider();
        }
    }

4、调用服务(MainViewModel.cs)

    public partial class MainViewModel : ViewModelBase
    {
        #region 变量
        private ILogTool _logTool;
        private IWindowService _windowService;
        #endregion 变量

        #region 变量 - 控件 Binding
        省略...
        #endregion 变量 - 控件 Binding

        #region 窗体事件
        // 通过构造函数注入
        public MainViewModel() { }
        // 通过构造函数注入
        public MainViewModel(ILogTool logTool, IWindowService windowService)
        {
            _logTool = logTool;
            _windowService = windowService;
        }

        省略...
        #endregion 窗体事件

        #region 控件事件
        public IRelayCommand Button2Command => new RelayCommand(Button2Fun);
        /// <summary>
        /// 弹出信息框
        /// </summary>
        public void Button2Fun()
        {
            _logTool.WriteLog("您点击了弹出信息框按钮");

            var msgWindow = App.Services.GetService<MsgViewModel>();
            if (msgWindow!=null)
                msgWindow.Msg = "您点击了弹出信息框按钮";
            // 
            _windowService.WindowShowDialog<MsgWindow>(App.Current.MainWindow);
        }
        #endregion 控件事件
    }

 

posted @ 2025-09-13 14:38  ꧁执笔小白꧂  阅读(34)  评论(0)    收藏  举报