Всегда ли привязка данных маршалируется к потоку пользовательского интерфейса?
При привязке к свойству в Silverlight 3 и 4, версии Windows Phone 7 silverlight и WPF 3.5 и 4 будут ли уведомления об изменении свойств всегда маршалироваться в поток пользовательского интерфейса? Знаете ли вы о каком-либо сценарии, где я не могу полагаться на это и должен был бы выполнить маршалинг в моем коде?
2 ответа:
Я сделал некоторые эксперименты...
INotifyPropertyChanged
Если вы вносите изменение в свойство из фонового потока, и оно срабатывает INotifyPropertyChanged из этого фонового потока, и свойство привязано к базе данных, то...
- WPF: он работает (т. е. databinder маршалирует его в поток пользовательского интерфейса)
- Silverlight5 и WinRT: он терпит неудачу (т. е. databinder не маршалирует)
- Телефон: я предполагаю, что это то же самое, что и Silverlight, но не пытался.
DependencyProperty
Что делать, если свойство является свойством зависимости, а не INotifyPropertyChanged? Что делать, если вы измените это свойство из фонового потока? Ну, я не проводил никаких экспериментов, но я читал, что он не выполняет никакой сортировки.INotifyCollectionChanged (например, ObservableCollection)
Если вы добавляете / удаляете элементы в ObservableCollection из фонового потока, и коллекция является привязка данных к списку или тому подобному, что тогда происходит?
- WPF: начиная с WPF4. 5, Вы можете использовать операции связывания.EnableCollectionSynchronization(collection, new object()); и он будет правильно маршалировать. Однако до WPF4. 5 все было так, как сказал Павел.
- Silverlight, WinRT: опять то же самое, что сказал Павол.