Всегда ли привязка данных направляется в поток пользовательского интерфейса? - PullRequest
3 голосов
/ 13 января 2011

При связывании со свойством в Silverlight 3 и 4, версия Silverlight для Windows Phone 7 и в WPF 3.5 и 4 всегда будут направлять уведомления об изменении свойства в поток пользовательского интерфейса? Вам известен какой-либо сценарий, в котором я не могу полагаться на это и должен был бы выполнить сортировку в моем коде?

Ответы [ 2 ]

8 голосов
/ 03 февраля 2013

Я провел несколько экспериментов ...

  1. INotifyPropertyChanged
    Если вы вносите изменение в свойство из фонового потока, и оно запускает INotifyPropertyChanged из этого фонового потока, а свойство привязывается к данным, то ...

    • WPF: он работает (то есть, блок данных выполняет маршализацию в потоке пользовательского интерфейса)
    • Silverlight5 и WinRT: происходит сбой (т. Е. Блок данных не выполняет маршалинг)
    • Телефон: я предполагаю, что он такой же, как Silverlight, но еще не пробовал.
  2. DependencyProperty
    Что если свойство является свойством зависимости, а не INotifyPropertyChanged? Что если вы измените это свойство из фонового потока? Ну, я не проводил никаких экспериментов, но я читал, что он не выполняет никакой сортировки.

  3. INotifyCollectionChanged (например, ObservableCollection)
    Если вы добавляете / удаляете элементы в ObservableCollection из фонового потока, а коллекция привязывается к списку или тому подобному, то что происходит?

    • WPF: Начиная с WPF4.5, вы можете использовать BindingOperations.EnableCollectionSynchronization (collection, new object ()); и это будет правильно. Однако до WPF4.5 это, как сказал Павло.
    • Silverlight, WinRT: опять то же самое, что сказал Павол.
2 голосов
/ 13 января 2011

Да, коллекции.Когда вы привязываете к наблюдаемой коллекции и изменяете ее из потока, не являющегося пользовательским интерфейсом, вы получаете исключение.Вам нужно будет перенести изменение коллекции в поток пользовательского интерфейса.

...