Я только что заметил, что я могу обновить источник привязки из другого потока, и он просто работает.
Итак, я подготовил демонстрационный пример ниже, и мои вопросы:
- Почему привязка работает? Почему повышение уведомления из другого потока не выдает?
- Это законно для обновления источника из другого потока, как это?
Я всегда использовал и говорил другим использовать Dispatcher.Invoke
, но, может быть, я просто чего-то не знаю? Может быть, привязка всегда гарантирует обновление своей цели в потоке пользовательского интерфейса или что-то в этом роде?
<TextBox x:Name="textBox" Text="{Binding Text}" />
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string Text { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Task.Run(() =>
{
Thread.Sleep(3000); // just wait long enough to ensure window is shown
// works
Text = "123";
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Text)));
// will crash with
// System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it'
textBox.Text = "123";
});
}
}