Cześć.
Ćwicząc dalej użycie Bindingu
w WinForms (wytłuszczam, żeby rzucało się w oczy, że nie chodzi o WPF ;) ) chciałem wrzucić sobie na formę zegarek.
Posiłkując się moim poprzednim tematem w którym podpowiedzieliście mi jak zrobić powiązanie klasa -> kontrolka ( CheckBox - wiązanie dwukierunkowe. ) zrobiłem sobie prosta klasę:
class Date : INotifyPropertyChanged
{
BackgroundWorker backgroundWorker = new BackgroundWorker();
public event PropertyChangedEventHandler PropertyChanged;
private DateTime _currentDate;
public DateTime currentDate
{
get { return _currentDate; }
set
{
_currentDate = value;
OnPropertyChanged();
}
}
public Date()
{
currentDate = DateTime.Now;
backgroundWorker.DoWork += BackgroundWorker_DoWork;
backgroundWorker.RunWorkerAsync();
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
currentDate = DateTime.Now;
}
protected void OnPropertyChanged(string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
a na formie głównej dodałem wiązanie:
Date date = new Date();
public Form1()
{
InitializeComponent();
label1.DataBindings.Add(new Binding("text", date, "currentDate", false, DataSourceUpdateMode.OnPropertyChanged));
}
Niestety, występuję błąd związany z dostępem do labela z innego wątku:
System.InvalidOperationException: „Nieprawidłowa operacja między wątkami: do formantu 'label1' uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony.”
Pytanie jak sobie z tym poradzić (wiem, że przy bezpośrednim dostępie z innego wątku do kontrolki trzeba użyć InvokeRequired
i Invoke
, ale w tym przypadku nie mam pomysłu jak...).
Z góry dziękuję za pomoc.