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