如何在WPF的DataGrid中展示通过Dapper获取的列表数据?
在WPF中使用Dapper获取数据并绑定到DataGrid的实现方法
1. 后台数据获取与直接绑定
数据查询逻辑和你在WinForms里的写法几乎一致,仅UI绑定方式有区别。推荐使用ObservableCollection<T>替代List<T>——它能自动通知UI数据变化,适配WPF的绑定机制:
using System.Collections.ObjectModel; using Dapper; using System.Data.SqlClient; // 假设已定义Person实体类 ObservableCollection<Person> personCollection = new ObservableCollection<Person>(); using (var conn = new SqlConnection(connectionString)) { var queryResult = conn.Query<Person>(yourQuery).ToList(); foreach (var person in queryResult) { personCollection.Add(person); } } // 将集合赋值给DataGrid的ItemsSource yourDataGrid.ItemsSource = personCollection;
如果只是一次性加载数据,用List<Person>直接赋值yourDataGrid.ItemsSource = list;也可行,但ObservableCollection更适合后续需要增删改数据并同步UI的场景。
2. XAML中定义DataGrid
先在XAML里声明DataGrid控件,可选择自动生成列或自定义列:
<Window x:Class="YourNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="800"> <Grid> <!-- 自动生成列,适合快速展示 --> <DataGrid x:Name="yourDataGrid" AutoGenerateColumns="True" /> </Grid> </Window>
若需自定义列(比如指定列名、格式),可手动配置:
<DataGrid x:Name="yourDataGrid" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="姓名" Binding="{Binding Name}" /> <DataGridTextColumn Header="年龄" Binding="{Binding Age}" /> <!-- 按Person类属性添加其他列 --> </DataGrid.Columns> </DataGrid>
3. 进阶:MVVM模式绑定(推荐)
如果项目遵循MVVM架构,可将数据集合放在ViewModel中实现解耦:
ViewModel示例:
using System.Collections.ObjectModel; using Dapper; using System.Data.SqlClient; public class MainViewModel { public ObservableCollection<Person> Persons { get; set; } = new ObservableCollection<Person>(); public void LoadData() { using (var conn = new SqlConnection(connectionString)) { var queryResult = conn.Query<Person>(yourQuery).ToList(); foreach (var person in queryResult) { Persons.Add(person); } } } }
XAML绑定配置:
<Window x:Class="YourNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:YourNamespace" Title="MainWindow" Height="450" Width="800"> <Window.DataContext> <local:MainViewModel /> </Window.DataContext> <Grid> <DataGrid ItemsSource="{Binding Persons}" AutoGenerateColumns="True" /> </Grid> </Window>
最后在窗口构造函数中触发数据加载:
public MainWindow() { InitializeComponent(); var viewModel = (MainViewModel)DataContext; viewModel.LoadData(); }
内容的提问来源于stack exchange,提问作者vick_93h
相关产品推荐
相关产品推荐

