学习WPF与C#:如何在UserControl中实现TextBlock数据绑定
没问题,我来帮你一步步实现WPF里UserControl的TextBlock数据绑定,结合你的SellerInfo类和数据库获取逻辑:
WPF UserControl中TextBlock数据绑定实现方案
首先要明确:WPF的数据绑定依赖属性变更通知机制,你的SellerInfo类目前缺少这个能力,会导致数据更新后UI无法自动刷新。我们从基础改造开始:
1. 改造SellerInfo类,实现INotifyPropertyChanged接口
这是WPF数据绑定的核心前提,能让UI感知到属性值的变化:
using System.ComponentModel; using System.Runtime.CompilerServices; public class SellerInfo : INotifyPropertyChanged { private string _name; private string _id; private float _workTime; private float _loginTime; private int _soldTickets; private int _ticketReservation; private float _totalAmountP; public string Name { get => _name; set { _name = value; OnPropertyChanged(); } } public string ID { get => _id; set { _id = value; OnPropertyChanged(); } } public float WorkTime // 改成PascalCase符合C#命名规范,如果你坚持小写也可以,绑定要对应 { get => _workTime; set { _workTime = value; OnPropertyChanged(); } } public float LoginTime { get => _loginTime; set { _loginTime = value; OnPropertyChanged(); } } public int SoldTickets { get => _soldTickets; set { _soldTickets = value; OnPropertyChanged(); } } public int TicketReservation { get => _ticketReservation; set { _ticketReservation = value; OnPropertyChanged(); } } public float TotalAmountP { get => _totalAmountP; set { _totalAmountP = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 完善数据库数据获取逻辑
你的accountInfo方法只初始化了连接,这里补全查询并赋值到SellerInfo的完整逻辑:
using System.Data.SqlClient; // 改成返回SellerInfo对象,方便后续绑定 public SellerInfo GetSellerInfoFromDb() { var sellerInfo = new SellerInfo(); string connectionString = @"Data Source=DESKTOP-8..."; // 替换成你的完整连接字符串 using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); // 假设查询当前登录卖家的信息,根据你的业务调整SQL和参数 string sql = "SELECT Name, ID, workTime, loginTime, soldTickets, ticketReservation, totalAmountP FROM Sellers WHERE ID = @SellerId"; using (SqlCommand cmd = new SqlCommand(sql, con)) { // 添加参数防止SQL注入,这里的卖家ID可以从登录态获取 cmd.Parameters.AddWithValue("@SellerId", "当前登录卖家ID"); using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { sellerInfo.Name = reader["Name"].ToString(); sellerInfo.ID = reader["ID"].ToString(); sellerInfo.WorkTime = Convert.ToSingle(reader["workTime"]); sellerInfo.LoginTime = Convert.ToSingle(reader["loginTime"]); sellerInfo.SoldTickets = Convert.ToInt32(reader["soldTickets"]); sellerInfo.TicketReservation = Convert.ToInt32(reader["ticketReservation"]); sellerInfo.TotalAmountP = Convert.ToSingle(reader["totalAmountP"]); } } } } return sellerInfo; }
3. 设置UserControl的DataContext
DataContext是WPF绑定的数据源入口,有两种常见方式:
方式一:代码后台直接设置(适合简单场景)
public partial class YourSellerControl : UserControl { public YourSellerControl() { InitializeComponent(); // 加载页面时获取数据并绑定 SellerInfo currentSeller = GetSellerInfoFromDb(); this.DataContext = currentSeller; } }
方式二:使用ViewModel(推荐,符合MVVM模式,适合复杂项目)
创建一个ViewModel类封装数据逻辑:
public class SellerViewModel { public SellerInfo CurrentSeller { get; set; } public SellerViewModel() { CurrentSeller = GetSellerInfoFromDb(); } // 把上面的GetSellerInfoFromDb方法移到这里 private SellerInfo GetSellerInfoFromDb() { // 实现同上 } }
然后在UserControl的XAML中设置DataContext(记得先添加命名空间):
<UserControl xmlns:local="clr-namespace:你的项目命名空间" ...> <UserControl.DataContext> <local:SellerViewModel /> </UserControl.DataContext> <!-- 你的TextBlock写在这里 --> </UserControl>
4. XAML中编写TextBlock绑定
现在就可以给TextBlock绑定对应的属性了,还可以通过StringFormat优化显示格式:
<StackPanel Margin="10"> <TextBlock Text="卖家名称:"/> <TextBlock Text="{Binding Name}" Margin="0,0,0,5"/> <TextBlock Text="卖家ID:"/> <TextBlock Text="{Binding ID}" Margin="0,0,0,5"/> <TextBlock Text="工作时长:"/> <TextBlock Text="{Binding WorkTime, StringFormat='{}{0:F2} 小时'}" Margin="0,0,0,5"/> <TextBlock Text="登录时长:"/> <TextBlock Text="{Binding LoginTime, StringFormat='{}{0:F2} 小时'}" Margin="0,0,0,5"/> <TextBlock Text="已售票数:"/> <TextBlock Text="{Binding SoldTickets}" Margin="0,0,0,5"/> <TextBlock Text="预约票数:"/> <TextBlock Text="{Binding TicketReservation}" Margin="0,0,0,5"/> <TextBlock Text="总金额:"/> <TextBlock Text="{Binding TotalAmountP, StringFormat='{}{0:C}'}" Margin="0,0,0,5"/> </StackPanel>
如果你没改属性命名,还是用小写的workTime,绑定就写{Binding workTime},必须和类中属性名完全一致
注意事项
- 确保数据库连接字符串正确,SQL语句和表结构匹配
- 如果需要异步加载数据,记得用
async/await避免UI阻塞 - 后续如果要动态更新数据,直接修改
SellerInfo的属性即可,UI会自动刷新(因为我们实现了INotifyPropertyChanged)
内容的提问来源于stack exchange,提问作者Danki
相关产品推荐
相关产品推荐

