четвер, 10 січня 2013 р.

Windows Phone 7 Pivot ListBox SelectionChanged

Ура. Поборол ложное срабатывание SelectionChanged в Pivot ListBox. Детали ниже:

Обработчик события нажития на ListBox:
        private void ServicesListBox_SelectionChanged (object sender, SelectionChangedEventArgs e)
        {
            if (!App.ViewModel.IsAllServicesLoaded)
            {
                this.ServicesListBox.SelectedIndex = -1;
                return;
            }
            if (ServicesListBox.SelectedItem != null)
            {
                Service selectedService = (Service)ServicesListBox.SelectedItem;
                string hostName = selectedService.HostName;
                string serviceDescription = selectedService.ServiceDescription;
                this.ServicesListBox.SelectedIndex = -1;
                NavigationService.Navigate(new Uri("/ServicePage.xaml?HostName="+hostName+"&ServiceDescription="+serviceDescription, UriKind.Relative));
            }
            else
            {
                return;
            }
        }

App.ViewModel.IsAllServicesLoaded - это true если завершилась загрузка и сериализация списка класса Service:


Сами вызовы суть тупо затычки с присваиваниями:
         public bool IsAllServicesLoaded
        {
            get;
            private set;
        }
        public void AllServicesLoaded()
        {
            this.IsAllServicesLoaded = true;
        }
        public void AllServicesLoaded_Disable()
        {
            this.IsAllServicesLoaded = false;
        }

Загрузка списка отправляется в фон:

        public void LoadServices()
        {
            AppSettings settings = new AppSettings();
            Uri uri = new Uri((string)settings.URLwpNagSetting + "?cmd=3"); // , UriKind.Relative);
            WebClient webClient = new WebClient();
            webClient.Credentials = new NetworkCredential((string)settings.UserNameSetting, (string)settings.UserPasswordSetting);
            webClient.DownloadStringCompleted += OnDownloadServicesCompleted;
            webClient.DownloadStringAsync(uri);
        }

По  окончинии загрузки 1) ставим false флагу для предотвращения срабатывания SelectionChanged 2) десериализуем для обновления привязки 3) врубаем true для флага и разрешаем таким образом обработку события SelectionChanged:
       void OnDownloadServicesCompleted(object sender, DownloadStringCompletedEventArgs args)
        {
            AllServicesLoaded_Disable();
            StringReader reader = new StringReader(args.Result);
            XmlSerializer xml = new XmlSerializer(typeof(ServiceBody));
            ServiceBody = xml.Deserialize(reader) as ServiceBody;
            AllServicesLoaded();         
        }

Помогла ссылка на stackoverflow:
http://stackoverflow.com/questions/7679586/listbox-selectionchanged-firing-when-setting-to-1-within-function-wp7

Немає коментарів:

Дописати коментар