Как обновить ItemsSource с помощью Silverlight 3?

У меня есть приложение Silverlight 3, которое вызывает традиционную веб-службу .NET (asmx), чтобы получить список записей, а затем отобразить его в элементе управления ListBox (lstRecords.ItemsSource = myRecords). Любые записи могут быть добавлены, обновлены или удалены в любое время, и я хотел бы, чтобы мой пользовательский интерфейс (записи, отображаемые в элементе управления ListBox) отражал последнее изменение.

Прямо сейчас у меня есть System.Threading.Timer, который каждые 5 секунд вызывает WebService и обновляет lstRecords.ItemsSource. Это вроде работает, но не совсем то, что мне нужно. Например, если выбрана строка и обновлен ItemsSource, я теряю выбор.

Мне было интересно, есть ли в Silverlight 3 механизм для обработки таких вещей. Есть ли у вас лучшее предложение, как мне это сделать?

Спасибо!


person Martin    schedule 18.07.2009    source источник


Ответы (2)


Я предлагаю следовать шаблону Model-View-ViewModel. Вы должны разделить свою веб-службу как модель и свой XAML как представление, ViewModel должен быть промежуточным слоем между ними. Свяжите свой View (XAML) с ObservableCollection в вашей ViewModel и пусть ViewModel напрямую вызывает WebService, а затем объединяет результат с вашим ObservableCollection. Если вы повторно связываете свою коллекцию каждый раз, вы теряете состояние привязки вашего ListBox.

Вот несколько ссылок для MVVM -

person Stan R.    schedule 18.07.2009

Если вы использовали диалоговое окно «Добавить ссылку на службу» в Visual Studio, ваша коллекция предположительно является ObservableCollection. Возможно, вы захотите вручную объединить свои новые элементы в эту коллекцию в фоновом потоке. т.е. вызовите свой веб-сервис, затем добавьте / удалите / обновите элементы в исходном списке для синхронизации списков. Не переплетайте весь список заново.

person Steve Willcock    schedule 18.07.2009