news 2026/3/10 3:06:28

WPF+SQLite+MVVM Demo

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WPF+SQLite+MVVM Demo

一.包:

  • CommunityToolkit.Mvvm
  • System.Data.SQLite.Core
  • Microsoft.Extensions.Hosting

二:App.xaml

<Application x:Class="SqliteDemo.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SqliteDemo"> <!--StartupUri="MainWindow.xaml"--> <Application.Resources> </Application.Resources> </Application>

三.App.xaml.cs

using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using SqliteDemo.ViewModels; using System.Configuration; using System.Data; using System.Windows; namespace SqliteDemo { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { private readonly IHost _host; public App() { _host = Host.CreateDefaultBuilder() .ConfigureServices((context, services) => { services.AddSingleton<MainWindowViewModel>(); }) .Build(); } protected override async void OnStartup(StartupEventArgs e) { await _host.StartAsync(); var mainWindow = new MainWindow { DataContext = _host.Services.GetRequiredService<MainWindowViewModel>() }; mainWindow.Show(); base.OnStartup(e); } protected override async void OnExit(ExitEventArgs e) { await _host.StopAsync(); base.OnExit(e); } } }

四.MainWindow.xaml

<Window x:Class="SqliteDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:SqliteDemo" xmlns:converters="clr-namespace:SqliteDemo.Converters" mc:Ignorable="d" Title="WPF SQLite Demo" Height="450" Width="800"> <Window.Resources> <converters:StringToVisibilityConverter x:Key="StringToVisibilityConverter"/> </Window.Resources> <Grid Margin="10"> <StackPanel> <Grid Height="26" Margin="0,0,0,5"> <TextBox Text="{Binding NewUserName, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" /> <TextBlock Text="输入名称" Foreground="Gray" IsHitTestVisible="False" Margin="5,0,0,0" VerticalAlignment="Center" Visibility="{Binding NewUserName, Converter={StaticResource StringToVisibilityConverter}}" /> </Grid> <!-- Age Input --> <Grid Height="26" Margin="0,0,0,10"> <TextBox Text="{Binding NewUserAgeText, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" /> <TextBlock Text="输入年龄" Foreground="Gray" IsHitTestVisible="False" Margin="5,0,0,0" VerticalAlignment="Center" Visibility="{Binding NewUserAgeText, Converter={StaticResource StringToVisibilityConverter}}" /> </Grid> <Button Content="Add User" Command="{Binding AddUserCommand}" Margin="0,0,0,10"/> <ListView ItemsSource="{Binding Users}"> <ListView.View> <GridView> <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="50"/> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="200"/> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="50"/> </GridView> </ListView.View> </ListView> </StackPanel> </Grid> </Window>

五.MainWindow.xaml.cs

using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace SqliteDemo { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } }

六.MainWindowViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using SqliteDemo.Database; using SqliteDemo.Models; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SqliteDemo.ViewModels { public partial class MainWindowViewModel : ObservableObject { private readonly DbContext _dbContext; [ObservableProperty] private ObservableCollection<User> _users; [ObservableProperty] private string _newUserName = ""; [ObservableProperty] private string _newUserAgeText = ""; public MainWindowViewModel() { _dbContext = new DbContext("Users.db"); LoadUsers(); } [RelayCommand] private void AddUser() { if (string.IsNullOrWhiteSpace(NewUserName) || string.IsNullOrWhiteSpace(NewUserAgeText)) return; if (!int.TryParse(NewUserAgeText, out int age)) return; using var connection = _dbContext.GetConnection(); connection.Open(); var command = connection.CreateCommand(); command.CommandText = "INSERT INTO Users (Name, Age) VALUES (@name, @age)"; command.Parameters.AddWithValue("@name", NewUserName); command.Parameters.AddWithValue("@age", age); command.ExecuteNonQuery(); LoadUsers(); // 清空输入 NewUserName = ""; NewUserAgeText = ""; } private void LoadUsers() { using var connection = _dbContext.GetConnection(); connection.Open(); var command = connection.CreateCommand(); command.CommandText = "SELECT * FROM Users"; using var reader = command.ExecuteReader(); var users = new ObservableCollection<User>(); while (reader.Read()) { users.Add(new User { Id = reader.GetInt32(0), Name = reader.GetString(1), Age = reader.GetInt32(2) }); } Users = users; } } }

七、Models.User

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SqliteDemo.Models { public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } }

八.Database.DbContext

using System; using System.Collections.Generic; using System.Data.SQLite; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SqliteDemo.Database { public class DbContext { private readonly string _connectionString; public DbContext(string dbPath) { _connectionString = $"Data Source={dbPath};Version=3;"; InitializeDatabase(); } private void InitializeDatabase() { using var connection = new SQLiteConnection(_connectionString); connection.Open(); var command = connection.CreateCommand(); command.CommandText = @"CREATE TABLE IF NOT EXISTS Users ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Age INTEGER NOT NULL );"; command.ExecuteNonQuery(); } public SQLiteConnection GetConnection() => new SQLiteConnection(_connectionString); } }

九.Converters.StringToVisibilityConverter

using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Data; namespace SqliteDemo.Converters { public class StringToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return string.IsNullOrWhiteSpace(value as string) ? Visibility.Visible : Visibility.Hidden; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/7 22:26:21

《从局部到全局:协同推理负载分配的深度优化指南》

设备间协同推理的负载分配本质是异构能力、任务语义与传输特性的三维共振,其核心困境并非简单的算力匹配,而是在设备类型离散、任务阶段耦合、网络状态波动的复杂场景中,打破“局部最优”陷阱,实现全局效能的精准跃迁。最初接触这类问题时,很容易陷入“性能导向”的单一分…

作者头像 李华
网站建设 2026/3/8 4:54:03

C#上位机开发源码 上位机项目源代码 采用基于RS485通讯总线的ModbusRtu协议

C#上位机开发源码 上位机项目源代码 采用基于RS485通讯总线的ModbusRtu协议&#xff0c;支持用户权限管理、sqlite数据库、实时曲线、历史曲线、历史报表、导出Excel、主界面布局可调带记忆等功能一、项目概述 本上位机项目基于 C# 开发&#xff0c;采用 RS485 通讯总线的 Modb…

作者头像 李华
网站建设 2026/3/3 20:41:00

基于Python的个性化音乐推荐系统设计与实现

一、系统开发背景与核心目标 当前音乐平台虽坐拥海量曲库&#xff0c;但传统推荐模式存在明显局限&#xff1a;多依赖热门榜单或简单曲风分类&#xff0c;难以捕捉用户深层音乐偏好——例如喜欢某首民谣的用户&#xff0c;可能同时偏爱小众独立音乐人作品&#xff0c;却被平台推…

作者头像 李华
网站建设 2026/3/9 12:36:59

基于微信小程序的健康指导平台小程序

基于微信小程序的健康指导平台设计与实现 第一章 系统整体架构设计 基于微信小程序的健康指导平台以“个性化干预、科学指导、便捷互动”为核心目标&#xff0c;采用“前端交互-服务中台-数据支撑”三层架构。系统核心包含七大功能模块&#xff1a;健康档案模块、评估检测模块、…

作者头像 李华
网站建设 2026/3/7 3:36:08

【2025最新】基于SpringBoot+Vue的安康旅游网站管理系统源码+MyBatis+MySQL

摘要 随着旅游业的快速发展和数字化进程的推进&#xff0c;旅游网站管理系统成为提升旅游服务质量和用户体验的重要工具。安康地区以其独特的自然风光和丰富的文化资源吸引了大量游客&#xff0c;传统的人工管理方式已难以满足日益增长的旅游需求。基于此&#xff0c;开发一套高…

作者头像 李华
网站建设 2026/3/6 19:18:18

学长亲荐2026 MBA必备AI论文工具TOP10:开题报告文献综述全测评

学长亲荐2026 MBA必备AI论文工具TOP10&#xff1a;开题报告文献综述全测评 2026年MBA论文写作工具测评&#xff1a;精准匹配学术需求 随着人工智能技术的不断进步&#xff0c;AI论文工具已成为MBA学生撰写开题报告、文献综述等核心内容的重要辅助。然而&#xff0c;面对市场上琳…

作者头像 李华