Измененные методом строковые значения не отображаются в текстовых полях с привязкой к данным

#c# #mysql #wpf #xaml

#c# #mysql #wpf #xaml

Вопрос:

Итак, у меня есть класс и форма. Класс содержит код MySQL, а форма содержит события, которые запускают код в классе MySQL

 // Code that acceses the class
// This triggers a method that is supposed to get the next record from the database.
private void next_Click(object sender, RoutedEventArgs e)
    {
        // Tag.text is the auto incremented unique record number.
        // The MySQL code is meant to get the next record ahead of the number in tag.text
        // in the corresponding table field.
        usersMysql.RegForm_Next(tag.Text);
    }
  

следующая часть представляет собой метод, который обращается к коду MySQL, предназначенному для извлечения следующей записи

 public void RegForm_Next(string tag_Value)
    {
        // tagValue now holds the number, which was in tag.text in the previous page, as a string
        // tagValue has already been predeclared as a string
        tagValue = tag_Value;
        // Navigation is the method that holds the MySQL code.
        // By passing "Forward", the method has a code to tell from that, which query to excecute.
        Navigation("Forward");
    }
  

Следующий код — это код MySQL, предназначенный для извлечения записи

 // Command to go to the next or previous rexord
    public void Navigation(string scroll)
    {

        if (scroll == "Forward")
        {
            query = "select * from temp.signup where tag = (select min(tag) from temp.signup where tag > '"   tagValue   "' );";
        }
        if (scroll ==  "Backward")
        {
            query = "select * from temp.signup where tag = (select max(tag) from temp.signup where tag < '"   tagValue   "' );";
        }

        //Database connection parameters
        string sqlcon = "datasource = "   datasource   ";"   "port="   port   ";"   "username="   username   ";"   "password="   password   ";";
        MySqlConnection con = new MySqlConnection(sqlcon);

        MySqlDataReader rdr;
        MySqlCommand cmd = new MySqlCommand(query, con);

        //Excecution
        try
        {
            //If the connection is Open
            con.Open();
            {
                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    // Declarations
                    // All these strings have been declared under the public class declaration.
                    sid = GetString(rdr, "id");
                    stag = GetColumnValueAsString(rdr, "tag");

                    sfirst = GetString(rdr, "first");
                    sfourth = GetString(rdr, "surname");

                    sdob = rdr.GetString("dob");
                    ssex = rdr.GetString("sex");

                    susername = GetString(rdr, "username");
                    spassword = GetString(rdr, "password");

                }
                con.Close();
            }
        }

        catch (Exception ex)
        {
            ModernDialog.ShowMessage(ex.Message, "SQL related error: Nav", MessageBoxButton.OK);
        }

    }
  

Теперь возникает проблема. Мне нужно привязать значения строк к текстовым полям на предыдущей странице, которая вызывала метод в классе MySQL up.

 // This is how the ID binding was set up for example.
// This is where sid was declared.
string sid;
public string ID
    {
        get
        {
            return sid;
        }

        set
        {
            sid = value;
            RaisePropertyChanged("ID");
        }
    }
  

И вот как была настроена привязка текстового поля

 <TextBox x:Name="id" Text="{Binding ID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" Margin="158,46,453,468" FontSize="13" TabIndex="1" />
  

Я установил контекст данных на странице с текстовыми полями, но строки никогда не загружаются обратно в текстовое поле

 public registrationForm()
    {
        InitializeComponent();

        usersMysql = new users.MySQL.usersMySQL();
        DataContext = usersMysql;
    }
  

Я могу подтвердить, что строки загружаются. Я тестировал с помощью окна сообщения. Но в текстовых полях ничего не отображается.

Это функция, которую я использую для «PropertyChanged» в классе

 //Property changed
    private void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
  

Если я привязываю два текстовых поля к одной и той же общедоступной строке, они отражают то, что вводится в другом. Тогда где я ошибаюсь?

Ответ №1:

Ваш код изменяет sid поле поддержки, а не ID свойство.

Следовательно, PropertyChanged событие никогда не запускается, и WPF никогда не узнает об изменении.

Комментарии:

1. Теперь я просто чувствую себя глупо. Я удивлен, что никто еще не проголосовал за это. Большое спасибо.