实用指南:MVVM Light 框架学习笔记

一、框架概述

  1. 定位:微软早期推出的轻量级 MVVM 框架,适合于中小型 WPF 应用

  2. 现状:已停止更新,替代方案推荐微软官方的CommunityToolkit.Mvvm或功能更全面的Prism

  3. 核心优势:轻量易上手、内置 IOC 容器、命令系统和消息机制

二、安装与初始化步骤

  1. 安装:NuGet 搜索并安装MvvmLight

  2. 自动生成文件:

    • ViewModel/MainViewModel.cs:默认主视图模型

    • ViewModel/ViewModelLocator.cs:视图模型定位器(IOC 容器入口)

  3. 修复命名空间报错:

    • 移除using Microsoft.Practices.ServiceLocation;

    • 添加using CommonServiceLocator;

  4. 注册定位器

    :在App.xaml中添加静态资源

  5. 绑定数据上下文:在 View 的 XAML 中

    DataContext="{Binding Source={StaticResource Locator}, Path=Main}"

三、核心类与功能解析

类名作用
ObservableObject实现INotifyPropertyChanged,支持属性变更通知(推荐 Model 继承)
ViewModelBase继承ObservableObject,增加 ViewModel 专属功能(如清理资源)
RelayCommand<T>实现ICommand接口,用于绑定 UI 命令(按钮点击、菜单选择等)
Messenger跨组件通信工具,支持消息的发布 / 订阅(解耦 View 与 ViewModel)
SimpleIoc轻量级 IOC 容器,管理服务和 ViewModel 的注册与实例化

四、依赖注入(DI)与服务使用

1. 服务使用流程

graph LR
A[定义模型] --> B[定义服务接口]
B --> C[实现服务类]
C --> D[注册服务到IOC]
D --> E[ViewModel构造函数注入]
E --> F[使用服务]

image-20251021193354984

2. 代码示例

  • 服务接口:

    public interface IService
    {
        List GetList(Expression> exp);
    }
  • 服务实现:

    public class UserService : IService
    {
        public List GetList(Expression> exp)
        {
            // 数据库查询逻辑
        }
    }
  • 注册服务

    (在ViewModelLocator中):

    SimpleIoc.Default.Register, UserService>();
  • ViewModel 注入:

    public class LoginViewModel : ViewModelBase
    {
        private readonly IService _userService;
        
        // 构造函数注入
        public LoginViewModel(IService userService)
        {
            _userService = userService;
        }
    }

五、关键场景实现

1. 密码框(PasswordBox)绑定

  • 原生Password

    属性不支持绑定,需通过辅助类实现:

  • 辅助类实现参考:通过附加属性监听密码变化(链接内容)

2. 窗体间通信方式

方式适用场景优缺点
静态类共享数据简单数据传递简单但耦合度高,不适合复杂场景
构造函数注入父子窗体通信清晰但仅限初始化时传递
Messenger消息任意组件通信(跨层级)解耦性好,适合复杂应用

3. 登录流程与窗体管理

(1)登录成功打开主窗体
  • 方式 1(推荐):通过App.xaml启动事件控制

    // App.xaml.cs
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var loginView = new LoginView();
        if (loginView.ShowDialog() == true) // 登录成功返回True
        {
            new MainView().ShowDialog();
        }
        Application.Current.Shutdown(); // 无论登录成功与否,最终退出
    }
    • 登录 ViewModel 中设置DialogResult:

      // 登录成功时
      (Application.Current.MainWindow as LoginView).DialogResult = true;
  • 方式 2(反射创建):适合动态加载场景

    var type = Type.GetType("命名空间.View.MainView");
    var mainView = (Window)Activator.CreateInstance(type);
    mainView.ShowDialog();
(2)解决主窗体关闭后程序不退出问题
  • 方式 1:监听主窗体Unloaded事件

    private void MainView_Unloaded(object sender, RoutedEventArgs e)
    {
        Application.Current.Shutdown();
    }
  • 方式 2:通过命令绑定(需安装Microsoft.Xaml.Behaviors.Wpf

    
    
        
            
        
    
    // 主窗体ViewModel
    public RelayCommand CloseAppCommand => new RelayCommand(() =>
    {
        Application.Current.Shutdown();
    });

六、扩展知识

  • IOC 与 DI 关系:

    • 控制反转(IOC):对象创建权由容器管理(而非自身)

    • 依赖注入(DI):容器将依赖对象自动注入到目标对象(如 ViewModel 接收服务实例)

  • 命令绑定注意事项:

    • RelayCommand适合无参数命令,RelayCommand<T>用于带参数场景

    • 命令执行逻辑可通过CanExecute控制是否启用(如按钮灰化)

七、框架对比

框架特点适用场景
MVVM Light轻量、简单,停止更新小型项目、学习入门
CommunityToolkit.Mvvm微软官方维护,支持.NET 5+,API 简洁新项目首选,中小型应用
Prism功能全面(模块化、导航、事件聚合)大型复杂应用

通过以上内容可快速掌握 MVVM Light 的核心用法,实际项目中建议优先选择活跃维护的框架(如 CommunityToolkit.Mvvm)以获得更好的兼容性和支持。

posted @ 2026-02-02 15:16  yangykaifa  阅读(53)  评论(0)    收藏  举报