Например, у меня есть бизнес-объект Person
:
class Person : INotifyPropertyChanged
{
string Name { get; set; }
DateTime DateOfBirth { get; set; }
}
// ^ abbreviated for better legibility; implementation would be trivial
И у меня есть некоторые элементы управления Winforms, связанные с данными для объекта этого класса:
Person somePerson = ...;
nameTextBox.DataBindings.Add("Text", somePerson, "Name");
dobDatePicker.DataBindings.Add("Value", somePerson, "DateOfBirth");
Теперь я делаю изменения в somePerson
, и благодаря внедрению INotifyPropertyChanged
эти изменения отражаются в пользовательском интерфейсе.Пока все хорошо.
Теперь к моей проблеме: Если я внесу изменения в somePerson
в рабочем потоке (т.е. не в потоке пользовательского интерфейса), например, потому что я загружаюданные из БД в качестве фоновой операции, это может вызвать исключения, поскольку привязка данных пытается обновить элементы управления, что разрешено только в потоке пользовательского интерфейса.
Это означает, что мне нужно вызвать InvokeRequired
на элементе пользовательского интерфейса, чтобы увидеть, разрешено ли мне обновлять бизнес-объект - что выглядит как нарушение логического уровня приложения .
В идеале, я хочу иметь возможность изменять свойбизнес-объекты, не заботясь о том, привязаны ли они к пользовательскому интерфейсу или нет.Это как-то возможно с привязкой данных Winforms или нет?