PropertyChanged не обновляется в xaml, если нет паузы - PullRequest
0 голосов
/ 19 октября 2018

Это длинный вопрос о глупой проблеме, которая не является жизненно важной для моего приложения, но все же очень странной.Мне кажется, если я это понимаю, это поможет мне лучше понять c # / wpf.

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

Текстовое поле связывается с

<TextBox x:Name="ConnectionLogTbx" Text="{Binding ConnectionLogText}" /> 

Код ниже (некоторые строки опущены): ConnectionLogText добавляется со строкой.Сначала дата + время "удалено".Второй раз с номерами строк пострадали.

Вставка базы данных занимает около 2 секунд.Я ожидаю, что появится первое сообщение журнала, затем пауза на две секунды (когда вставляются новые строки), а затем второе сообщение журнала.Самое смешное, что Textbox обновляется обеими строками после операции вставки.Никакие сообщения журнала не появляются перед операцией вставки.Показанное время соответствует ожидаемому с интервалом около 2 секунд.

Однако, если я добавлю messagebox.show в установщик для свойства (и, следовательно, создаю паузу), приложение будет работать так, как ожидается.Первое сообщение журнала появляется в текстовом поле, и после щелчка окна сообщения происходит операция вставки, после чего появляется второе сообщение журнала.

Похоже, что WPF требуется перерыв для обновления текстового поля, но этоне соответствует тому, что я понимаю о WPF.

Может ли кто-нибудь мне помочь?

public partial class MainWindow : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private string connectionLogText ="";

    public string ConnectionLogText
        {
            get { return connectionLogText; }
            set
            {
                if (value != connectionLogText)
                {
                    connectionLogText = value;
                    OnPropertyChanged("ConnectionLogText");
                    //MessageBox.Show(""); //THIS IS THE MESSAGEBOX
                 }
            }

       }


    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }


    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }


    private void BrowseImportFile_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        if (openFileDialog.ShowDialog() == true)
        {
            ImportFilePathTbx.Text = openFileDialog.FileName;
            ImportFileBtn.IsEnabled = true;
        }
    }

    private void ImportFileBtn_Click(object sender, RoutedEventArgs e)
    {
         string connString = 
      ConfigurationManager.ConnectionStrings["connSTring"].ConnectionString;

        MySqlConnection conn = new MySqlConnection(connString);

        conn.Open();
       //here the content of the current db table is deleted
        conn.Close();
        ConnectionLogText += DateTime.Now.ToString("hh:mm:ss.fff") + " 
Deleted" + "\r\n";

        conn.Open();

        int numberOfRowsAffected = 0;
        foreach (DataRow dataRow in table.Rows)
       {
            //new data inserted into database numberOfRowsAffected++;
        }
        conn.Close();

        ConnectionLogText += DateTime.Now.ToString("hh:mm:ss.fff") + " " + 
numberOfRowsAffected +  " rows inserted" + "\r\n" ;
        }
 }

1 Ответ

0 голосов
/ 19 октября 2018

Вы не можете обновить TextBlock и читать записи из базы данных одновременно в одном потоке.

Вы должны выполнять операции с базой данных в фоновом потоке.Самый простой способ сделать это - использовать параллельная библиотека задач (TPL) :

private async void ImportFileBtn_Click(object sender, RoutedEventArgs e)
{
    string connString = ConfigurationManager.ConnectionStrings["connSTring"].ConnectionString;
    await Task.Run(() =>
    {
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            //here the content of the current db table is deleted
            conn.Close();
        }
    });

    ConnectionLogText += DateTime.Now.ToString("hh:mm:ss.fff") + " Deleted" + "\r\n";

    int numberOfRowsAffected = 0;
    await Task.Run(() =>
    {
        conn.Open();
        foreach (DataRow dataRow in table.Rows)
        {
            //new data inserted into database numberOfRowsAffected++;
        }
        conn.Close();
    });

    ConnectionLogText += DateTime.Now.ToString("hh:mm:ss.fff") + " " + numberOfRowsAffected + " rows inserted" + "\r\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...