如何在WPF ListView中绑定并显示从API获取的SQL数据列表?
WPF ListView数据绑定失败的修复方案
问题分析
你的代码存在以下关键问题导致绑定失效:
- XAML中存在拼写错误;
- 未设置
DataContext,ListView无法找到绑定源; - 使用
List<T>无法通知UI数据更新; - 数据变量是局部变量,无法被绑定访问;
- 未实现属性变更通知接口。
修复步骤及代码修改
1. 修复XAML拼写错误
将<GridViewColumno>修正为<GridViewColumn>,并确保ItemsSource绑定到正确的属性名:
<ListView HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" MinWidth="80" MinHeight="25" ItemsSource="{Binding InformationList}"> <ListView.View> <GridView> <GridViewColumn Header="Code" DisplayMemberBinding="{Binding Code}" Width="100"/> <GridViewColumn Header="Event" DisplayMemberBinding="{Binding Event}" Width="100"/> <GridViewColumn Header="DateEntry" DisplayMemberBinding="{Binding DateEntry}" Width="100"/> <GridViewColumn Header="Date Exit" DisplayMemberBinding="{Binding DateExit}" Width="100"/> <GridViewColumn Header="Door Entry" DisplayMemberBinding="{Binding DoorEntry}" Width="100"/> <GridViewColumn Header="Door Exit" DisplayMemberBinding="{Binding DoorExit}" Width="100"/> </GridView> </ListView.View> </ListView>
2. 修改C#代码,实现绑定要求
- 让窗口类实现
INotifyPropertyChanged接口,用于属性变更通知; - 将
List<T>替换为ObservableCollection<T>,确保数据更新时UI自动刷新; - 将局部变量改为公共属性,并在获取数据后更新该属性;
- 设置窗口的
DataContext为自身,让ListView能找到绑定源。
修改后的C#代码:
using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; using Newtonsoft.Json; using RestSharp; public partial class MainWindow : Window, INotifyPropertyChanged { private ObservableCollection<Information> _informationList; public ObservableCollection<Information> InformationList { get => _informationList; set { _informationList = value; OnPropertyChanged(); } } public MainWindow() { InitializeComponent(); DataContext = this; InformationList = new ObservableCollection<Information>(); } public void GetTable_Click(object sender, RoutedEventArgs e) { var client = new RestClient("http://your-api-address-and-port"); var request = new RestRequest("GetAccesos", Method.Get); var response = client.Execute(request); if (response.StatusCode == System.Net.HttpStatusCode.OK) { var dataList = JsonConvert.DeserializeObject<List<Information>>(response.Content); // 清空原有数据并添加新数据,或直接替换集合 InformationList.Clear(); foreach (var item in dataList) { InformationList.Add(item); } // 也可直接替换:InformationList = new ObservableCollection<Information>(dataList); } } public class Information { public string Code { get; set; } public string Event { get; set; } public DateTime? DateEntry { get; set; } public DateTime? DateExit { get; set; } public string DoorEntry { get; set; } public string DoorExit { get; set; } } // INotifyPropertyChanged接口实现 public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
关键说明
ObservableCollection<T>:相比List<T>,它会在集合添加、删除、修改元素时自动通知UI刷新;INotifyPropertyChanged:当InformationList属性整体替换时,通过OnPropertyChanged()通知UI更新绑定;DataContext = this:告诉ListView,绑定的数据来源是当前窗口实例;- 若需保留原有绑定上下文,可使用
Clear()+Add()更新数据,也可直接替换集合并触发属性变更通知。
内容的提问来源于stack exchange,提问作者user20370754
相关产品推荐
相关产品推荐

