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


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

2 2

2 ответа:

Я сделал некоторые эксперименты...

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

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

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

    • WPF: начиная с WPF4. 5, Вы можете использовать операции связывания.EnableCollectionSynchronization(collection, new object()); и он будет правильно маршалировать. Однако до WPF4. 5 все было так, как сказал Павел.
    • Silverlight, WinRT: опять то же самое, что сказал Павол.
       

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