Привязки и обновления из другого потока - PullRequest
0 голосов
/ 09 апреля 2020

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

Итак, я подготовил демонстрационный пример ниже, и мои вопросы:

  • Почему привязка работает? Почему повышение уведомления из другого потока не выдает?
  • Это законно для обновления источника из другого потока, как это?

Я всегда использовал и говорил другим использовать 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";
        });
    }
}

1 Ответ

2 голосов
/ 09 апреля 2020

Вполне законно установить свойство source в фоновом потоке. Каркас обрабатывает маршалинг для вас изнутри.

Если вы попытаетесь добавить или удалить элементы из исходной коллекции, это другая история:

Как обновить только свойство в наблюдаемой коллекции из потока, отличного от потока диспетчера в WPF MVVM?

Целевые свойства, или, точнее, свойства DependencyObjects, доступны только для потока в который объект был первоначально создан, хотя. Но вам не нужно использовать диспетчер для установки свойств модели представления из фонового потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...