实用指南:MVVM Light 框架学习笔记
一、框架概述
定位:微软早期推出的轻量级 MVVM 框架,适合于中小型 WPF 应用
现状:已停止更新,替代方案推荐微软官方的
CommunityToolkit.Mvvm或功能更全面的Prism核心优势:轻量易上手、内置 IOC 容器、命令系统和消息机制
二、安装与初始化步骤
安装:NuGet 搜索并安装
MvvmLight包自动生成文件:
ViewModel/MainViewModel.cs:默认主视图模型ViewModel/ViewModelLocator.cs:视图模型定位器(IOC 容器入口)
修复命名空间报错:
移除
using Microsoft.Practices.ServiceLocation;添加
using CommonServiceLocator;
注册定位器
:在App.xaml中添加静态资源
绑定数据上下文:在 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[使用服务]

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)以获得更好的兼容性和支持。

浙公网安备 33010602011771号