【问题标题】:Data Binding from sql to text box isnt working从 sql 到文本框的数据绑定不起作用
【发布时间】:2025-12-28 17:15:10
【问题描述】:

有一个带有文本框的简单 WPF 窗口。在这个窗口中,我想显示一个用户 ID。这是 winforms 中的一个如此简单的过程,但我似乎无法在 XAML 中完全理解它。 该代码是一个简单的类 - 用户列表如下......

public class User
    {
        private string userId;
        private string employeeNumber;
        ...

        public User()
        { }

        public string UserId
        {
            get
            { 
            return userId;
            }
            set
            {
                userId = value;
            }
        }


        public string EmployeeNumber
        {
            get
            {
                return employeeNumber;
            }
            set
            {
                employeeNumber = value;
            }
        }
    }
    ...

wpf 窗口的 xaml 是...

<Window
    ...
    <Window.Resources></Window.Resources>
    <Grid>
        <Label x:Name="lblUserId" Content="User Id" HorizontalAlignment="Left" Margin="84,76,0,0" VerticalAlignment="Top"/>
        <Label x:Name="lblEmployeeNumber" Content="Employee Number" HorizontalAlignment="Left" Margin="84,106,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="tbUserId" HorizontalAlignment="Left" Height="23" Margin="200,76,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Width="120" />
        <TextBox x:Name="tbEmployeeNumber" HorizontalAlignment="Left" Height="23" Margin="200,106,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" />
    </Grid>
</Window>

当窗口加载后,这段代码被执行。

public partial class winTest : Window
{
    public winTest()
    {
        InitializeComponent();
    }

    private User user;
    private List<User> userList;
    private List<Permissions> permissionsList;

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
            string userId = "1234";
            user = UserDB.GetUserInfo(userId);
    }

}
...

GetUserInfo 的代码是

public static User GetUserInfo(string userID)
    {
        User user = new User();
        SqlConnection connection = BusinessDB.GetConnection();
        string selectStatement = "SELECT userid, empno, FROM employees " +
        "WHERE userid = @UserID";
        SqlCommand selectCommand = new SqlCommand(selectStatement, connection);
        selectCommand.Parameters.AddWithValue("userid", userID);
        try
        {
            connection.Open();
            //SqlDataReader reader = selectCommand.ExecuteReader();
            SqlDataReader reader = selectCommand.ExecuteReader(CommandBehavior.SingleRow);
            if (reader.Read())
            {
                if (reader["userid"] == DBNull.Value)
                {
                    user.UserId = "";
                }
                else
                {
                    user.UserId = (reader["userid"]).ToString();
                }

                if (reader["empno"] == DBNull.Value)
                {
                    user.EmployeeNumber = "";
                }
                else
                {
                    user.EmployeeNumber = reader["empno"].ToString();
                }
        }
    return user 
    }   
 ...

单步执行代码显示用户确实填充了正确的信息 - 它是让我知道的绑定部分。上面的 xaml 没有列出任何绑定,因为我已经尝试将它绑定到除了我的狗鼻子之外的所有东西,但我仍然得到空文本框。 任何人都可以帮助一个wpf新手吗?非常感谢。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:
    1. 您需要将您的 User 设为公共属性,而不是私有字段:

      public User User { get; set }
      
    2. 如果您希望您的绑定响应User 值的变化,您的Window 类需要实现INotifyPropertyChanged

      public partial class winTest : Window, INotifyPropertyChanged
      {
          public event PropertyChangedEventHandler PropertyChanged;
      
          private void NotifyPropertyChanged(string propertyName)
          {
              if (PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
              }
          }
      
          // <your other winTest code goes here>
      }
      
    3. 您的绑定应如下所示:

      <TextBox x:Name="tbUserId"
               Text="{Binding User.UserId}"
               HorizontalAlignment="Left"
               Height="23"
               Margin="200,76,0,0"
               TextWrapping="Wrap"
               VerticalAlignment="Top"
               Width="120" />
      

    【讨论】:

      【解决方案2】:

      正如 devuxer 所说,确保将您的公共属性重写为:

      public string UserId { get; set; }
      public string EmployeeNumber { get; set; }
      

      在你的 Window_loaded() 上试试这个方法;

      private void Window_Loaded(object sender, RoutedEventArgs e)
      {
              string userId = "1234";
              user = UserDB.GetUserInfo(userId);
              tbUserId.Text = user.UserId;
              tbEmployeeNumber.Text = user.tbEmployeeNumber;
      
      }
      

      【讨论】:

      • 非常感谢你们!非常有帮助 - 这就是我喜欢这个网站的原因。