В решение на MvvmCross имам единичен сервизен клас, който получава елементи от уеб услуга и актуализира публична ObservableCollection. Той прави това на всеки пет секунди и елементите могат да се добавят или премахват или свойствата им да се променят.
Също така имам ViewModel, който има публично свойство, което е зададено на ObservableCollection на услугата. Изгледът е обвързан с ObservableCollection, така че когато елементите се добавят, премахват или променят, изгледът трябва да се актуализира, за да покаже това.
Въпреки това, както се очаква, получавам изключение за нишка, тъй като ObservableCollection се актуализира от нишка, различна от Main/UI, и следователно обвързването не може да актуализира потребителския интерфейс.
В рамките на Услугата нямам лесно достъпно повикване InvokeOnMainThread
, така че няма очевиден междуплатформен начин за връщане към основната нишка при актуализиране на ObservableCollection. Освен това, правенето на това просто изглежда погрешно - услугата не трябва да се занимава с въпросите на потребителския интерфейс (докато ViewModel може).
Също така съм малко нервен относно излагането на събития от услуга, в случай че това причини ViewModels да не се събират боклуци. Отбелязвам, че в серията N+1 на @slodge http://mvvmcross.wordpress.com/ той използва услуга за съобщения, вероятно за да се избегне точно това.
Така че възможно решение може да бъде да се публикува съобщение с най-новия списък с елементи и за ViewModel да се абонира за съобщението и да актуализира своя собствена ObservableCollection в нишката на потребителския интерфейс, като сравнява съдържанието на съобщението с него. Но това изглежда малко тромаво.
Всякакви предложения за най-добрия начин за прилагане на това ще бъдат оценени - благодаря.