You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

学习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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:27:57