Следующий код является упрощенной версией моей проблемы:
public partial class Form1 : Form
{
BackgroundWorker bw;
Class myClass = new Class();
public Form1()
{
InitializeComponent();
bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
label1.DataBindings.Add("Text", myClass, "Text", true, DataSourceUpdateMode.Never);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
myClass.Text = "Hi";
}
private void button1_Click(object sender, EventArgs e)
{
bw.RunWorkerAsync();
}
}
public class Class : INotifyPropertyChanged
{
private string _Text;
private void SetText(string value)
{
if (_Text != value)
{
_Text = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public string Text
{
get { return _Text; }
set { SetText(value); OnPropertyChanged(new PropertyChangedEventArgs("Text")); }
}
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null) PropertyChanged(this, e);
}
}
Что происходит, когда я нажимаю кнопку 1 (которая вызывает button1_Click
), текст в label1
не обновляется. Это связано с тем, что свойство label1.Text
внутренне пытается измениться из потока моего BackgroundWorker
, что внутренне вызывает исключение. В общем, как лучше всего решить эту проблему? Какую часть этого кода вы бы изменили, если вы хотите обновить мое свойство Class.Text
из другого потока, но к нему также должен быть привязан элемент управления?