Текстовое поле, привязанное к свойству в другом классе, не обновляется - PullRequest
0 голосов
/ 08 августа 2011

У меня есть форма окна «MyForm» с текстовым полем, которое привязано к свойству другого класса «MyData». Режим обновления источника данных установлен на «При изменении свойства»

Я использовал IDE VisualStudio. Создан следующий код для привязки

this.txtYield.DataBindings.Add(new Binding("Text", this.BindingSourceMyDataClass, "PropertyInMyDataClass", true, DataSourceUpdateMode.OnPropertyChanged));

В конструкторе формы после инициализации значений был добавлен код для привязки класса MyData к форме

myDataClassInstantiated = new MyDataClass();
BindingSourceMyDataClass.DataSource = myDataClassInstantiated;

Реализован интерфейс INotifyProperty:

public double PropertyInMyDataClass
{
    get { return _PropertyInMyDataClass; }
    set
    {
        if (!Equals(_PropertyInMyDataClass, value))
        {
            _PropertyInMyDataClass = value;
            FirePropertyChanged("PropertyInMyDataClass");
        }
    }
}

Фоновый рабочий используется для выполнения расчетов и обновления свойства 'PropertyInMyDataClass'

Я ожидал, что текстовое поле в форме будет обновляться автоматически после завершения фонового рабочего процесса. Этого не произошло

Если я вручную копирую присвоить значение из свойства текстовому полю формы, значение отображается правильно

this.txtYield.Text = String.Format("{0:F0}", myDataClassInstantiated.PropertyInMyDataClass);

Я пытался добавить Refresh () и Update () в метод MyForm.MyBackgroundWorker_RunWorkerCompleted, но данные по-прежнему не обновляются.

Если позже я запущу другой фоновый рабочий, который обновляет различные текстовые поля в той же форме, текстовое поле, привязанное к PropertyInMyDataClass, будет обновлено

Буду признателен за предложения, которые помогут мне понять и решить эту проблему, связанную с данными

1 Ответ

0 голосов
/ 08 августа 2011

Проблема возникает с нескольких точек зрения.Если вы запускаете процесс в фоновом потоке, фоновый поток не может напрямую получить доступ к элементу управления в вашей форме (который находится в другом потоке) напрямую, в противном случае вы получите исключение.Вы также не можете ожидать, что поток пользовательского интерфейса будет обновляться на основе состояний в фоновом потоке, если вы не подключите его для этого.Для этого вам нужно вызвать делегата в главном потоке пользовательского интерфейса.

Поместите этот код (измените его, чтобы обновить любой элемент управления с любым типом значения, который вы хотите) в форме пользовательского интерфейса.

 public void UpdateOutput(string text)
     {
         this.Invoke((MethodInvoker) delegate {
           lstOutput.Items.Add(text);
         });
     }

Затем вы можете вызвать эту функцию в фоновом рабочем потоке.(если ваша функция фонового процесса живет в той же форме, вы можете вызвать ее напрямую), если нет, то вам понадобится ссылка на форму пользовательского интерфейса в классе, в котором выполняется фоновый процесс.

...