ListPicker SelectedIndex не отображается правильно в WP7 - PullRequest
1 голос
/ 27 апреля 2011

У меня странная проблема с элементом ListPicker в WP7.

Проблема

Установка ListPicker SelectedIndex с помощью Binding не изменяет элемент по умолчанию, отображаемый после его загрузки.

Пример

В качестве теста я быстро изменил Microsoft SettingsSample, добавив ListPicker. Вы можете скачать его по адресу: http://www.mediafire.com/?w0n0ymkh4dwe9b3

Это наш свернутый ListPicker:

 -----------------
| Times New Roman |
 -----------------

И это ListPicker при расширении:

 -----------------
| Times New Roman |
| Arial           |
| Comic Sans MS   |
 -----------------

Если мы выберем «Arial», уйдем, а затем вернемся снова, ListPicker по-прежнему показывает:

 -----------------
| Times New Roman |
 -----------------

В то время как он должен показывать (потому что настройки сохранены правильно):

 -----------------
| Arial           |
 -----------------

Дальнейшая путаница

В приведенном выше примере, если мы нажимаем на ListPicker, фактически выбирается «Arial» (потому что текст для ListBoxItem выделен). По какой-то причине он просто не отображается в качестве значения по умолчанию при загрузке элемента управления.

Если мы забудем о подходе Binding и вместо этого вручную установим SelectedIndex в '1' в XAML, то при загрузке элемента управления мы получим ожидаемый результат:

 -----------------
| Arial           |
 -----------------

Идеи

Есть ли способ обновить элемент управления ListPicker, чтобы он правильно отображал SelectedIndex при использовании Binding? Я предполагаю, что упускаю что-то очевидное, но я искал и не смог ничего найти.

Заранее спасибо!

1 Ответ

6 голосов
/ 27 апреля 2011

Я полагаю, что есть ошибка в элементе управления ListPicker, связанная с привязкой выбора.Я думаю, что рекомендуемое решение - вручную установить привязку в переопределении OnNavigatedTo для страницы.Следующий код показывает, как я делаю это для одного из моих приложений:

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            Binding pickerBinding = new Binding("DistanceUnit")
            {
                Source = App.Current.Resources["Settings"],
                Mode = BindingMode.TwoWay
            };
            this._distanceUnit.SetBinding(ListPicker.SelectedItemProperty, pickerBinding);
        }

В качестве альтернативы, вы можете обработать событие Loaded для самого ListPicker и установить привязку там.Предыдущий подход идеален, если у вас есть несколько сборщиков.Последний подход больше подходит для сценария, когда у вас есть только один сборщик.

ПРИМЕЧАНИЕ: Я не проверял последний исходный код Инструментария, чтобы убедиться, что это все ещевыдающаяся ошибка.

...