WPF开发个人记账系统:MVVM与SQLite实战

发布时间:2026/7/31 2:25:05
WPF开发个人记账系统:MVVM与SQLite实战 1. 项目概述个人记账小系统的核心价值这个个人记账小系统是我在业余时间开发的一个轻量级财务管理工具主要解决日常收支记录的痛点。相比市面上复杂的记账软件它去除了所有冗余功能保留了最核心的记账、统计和报表功能。整个系统采用WPF框架开发界面简洁直观数据存储在本地SQLite数据库中既保证了隐私性又免去了网络依赖。提示系统源码完全开放特别适合.NET开发者学习WPF数据绑定、LINQ查询和图表绘制的实战应用我最初开发这个系统的动机很简单市面上的记账App要么功能太臃肿要么充斥着广告。作为一个程序员我更想要一个能完全掌控的、可以随时自定义功能的解决方案。现在这个版本已经稳定运行了两年多期间根据实际使用反馈迭代了十几个小版本。2. 系统架构与技术选型2.1 前端界面设计系统采用WPF的MVVM模式开发主要使用了以下布局控件DockPanel主窗口的基础布局Grid数据表格的精确排版StackPanel工具栏的垂直/水平排列TabControl不同功能模块的切换!-- 典型布局示例 -- DockPanel Menu DockPanel.DockTop.../Menu StatusBar DockPanel.DockBottom.../StatusBar TabControl TabItem Header记账 Grid Grid.RowDefinitions.../Grid.RowDefinitions StackPanel OrientationHorizontal.../StackPanel /Grid /TabItem /TabControl /DockPanel2.2 后端数据处理数据层采用Entity Framework Core操作SQLite主要实体包括Transaction记录每笔交易的金额、类型、分类、时间等Category收支分类体系可自定义Budget预算设置Account多账户管理// 典型数据模型 public class Transaction { public int Id { get; set; } public decimal Amount { get; set; } public DateTime Date { get; set; } public string Description { get; set; } public TransactionType Type { get; set; } public int CategoryId { get; set; } public Category Category { get; set; } }2.3 图表可视化使用LiveCharts库实现动态图表支持月度收支趋势折线图分类占比饼图年度对比柱状图预算完成度仪表盘3. 核心功能实现详解3.1 交易记录的CRUD操作记账系统的核心是交易记录的增删改查。我采用了Repository模式进行封装主要技术点包括异步数据加载使用async/await避免UI卡顿数据验证在ViewModel层实现IDataErrorInfo批量操作支持CSV导入导出// 典型ViewModel代码 public class TransactionViewModel : INotifyPropertyChanged, IDataErrorInfo { private readonly ITransactionRepository _repository; public async Task LoadDataAsync() { Transactions new ObservableCollectionTransaction( await _repository.GetByDateRangeAsync(StartDate, EndDate)); } public string Error null; public string this[string columnName] { get { if (columnName nameof(Amount) Amount 0) return 金额必须大于0; return null; } } }3.2 统计报表生成报表系统采用策略模式支持多种统计维度按日/周/月/年的收支汇总分类对比分析预算执行情况账户余额变动统计引擎的核心是LINQ查询例如// 月度统计示例 var monthlyStats transactions .GroupBy(t new { t.Date.Year, t.Date.Month }) .Select(g new { Year g.Key.Year, Month g.Key.Month, Income g.Where(t t.Type TransactionType.Income).Sum(t t.Amount), Expense g.Where(t t.Type TransactionType.Expense).Sum(t t.Amount) }) .OrderBy(x x.Year) .ThenBy(x x.Month);3.3 数据备份与恢复考虑到数据安全性实现了以下机制自动备份每天首次启动时自动备份数据库手动导出支持导出为JSON/CSV格式云同步可选通过Web API与自建服务器同步备份核心代码public async Task BackupDatabaseAsync(string backupPath) { var dbPath GetDatabasePath(); using (var source File.OpenRead(dbPath)) using (var dest File.Create(backupPath)) { await source.CopyToAsync(dest); } }4. 开发中的关键问题与解决方案4.1 数据绑定性能优化初期当交易记录超过5000条时界面会出现明显卡顿。通过以下措施优化虚拟化容器使用VirtualizingStackPanel分页加载每次只加载当前月的记录延迟渲染对图表数据采用按需加载!-- ListView虚拟化示例 -- ListView VirtualizingStackPanel.IsVirtualizingTrue VirtualizingStackPanel.VirtualizationModeRecycling ListView.ItemTemplate.../ListView.ItemTemplate /ListView4.2 多主题切换实现为满足不同用户的视觉偏好实现了动态换肤功能定义资源字典存储不同主题的颜色和样式使用ResourceDictionary.MergedDictionaries动态切换配合MahApps.Metro等UI库增强效果public void ApplyTheme(string themeName) { var themeDict new ResourceDictionary { Source new Uri($Themes/{themeName}.xaml, UriKind.Relative) }; Application.Current.Resources.MergedDictionaries[0] themeDict; }4.3 跨平台兼容性处理虽然主要面向Windows但通过以下方式提升了兼容性使用.NET Core 3.1/NET 5而非传统.NET Framework避免调用Windows特有API数据库层使用跨平台的SQLite5. 项目部署与使用指南5.1 开发环境搭建安装Visual Studio 2019/2022社区版即可确保勾选.NET桌面开发工作负载克隆源码仓库git clone https://example.com/accounting-system.git还原NuGet包dotnet restore5.2 数据库初始化系统首次运行时会自动创建数据库结构如需手动初始化dotnet ef database update5.3 自定义配置通过修改appsettings.json可以调整默认货币符号日期显示格式备份保留天数主题颜色{ AppSettings: { CurrencySymbol: ¥, DateFormat: yyyy-MM-dd, BackupRetentionDays: 7, DefaultTheme: Light } }6. 扩展开发建议基于现有系统可以进一步扩展多用户支持添加登录系统和数据隔离智能分类利用机器学习自动识别交易类型账单提醒集成系统通知功能投资跟踪添加股票、基金等投资记录移动端适配通过MAUI实现跨平台对于想学习WPF的开发者这个项目提供了很好的起点。我在代码中刻意保持了简洁性每个核心功能模块都控制在300行以内方便理解。特别推荐重点研究MainWindowViewModel.csMVVM模式的典型实现TransactionRepository.csEF Core的最佳实践ChartHelper.cs动态图表的数据绑定技巧实际开发中最大的教训是不要过早优化。初期我花了太多时间设计完美架构后来发现对于个人项目快速迭代才是关键。现在这个版本已经是第三次重构后的结果每次重构都让代码更简洁、更易维护。