GKP1992 Ответов: 1

Поле со списком UWP внутри элемента управления pivot теряет выбранный элемент при тестировании с помощью симулятора или устройства surface pro.


Итак, я уже 2 дня сталкиваюсь с проблемой с приложением UWP, которая, похоже, возникает только при использовании симулятора или устройства surface pro (target).

Таким образом, у нас есть приложение UWP на работе, которое сделано с использованием Galasoft MVVM light framework.

На одном из экранов приложения есть список "оборудования", который имеет кнопку для изменения этого конкретного оборудования.
После нажатия этой кнопки пользователь переходит на другую страницу, которая имеет сводный элемент управления с 4 вкладками. Источником элементов этого сводного элемента управления является коллекция представлений.

Некоторые из этих вкладок также содержат поля со списком пар ключ-значение и привязанное к ним свойство выбранного элемента.

Недавно пользователь сообщил о проблеме, что первый выпадающий список (поле со списком) на одной из этих вкладок не имеет выбранного элемента, тогда как он должен был бы иметь.

Мы начали тестировать сценарий, и все, кажется, работает хорошо, пока я не начну тестировать с помощью симулятора UWP, предоставленного в Visual Studio Professional 2017 (15.7.1), что действительно очень раздражает благодаря BSOD каждые 10 или около того минут использования.

Во всяком случае, при использовании симулятора с "режимом мыши" в качестве выбранного режима взаимодействия я получаю проблему.
При отладке я заметил дополнительный вызов из внешнего кода к сеттеру свойства в ViewModel, который связан с выбранным свойством элемента указанного поля со списком, с нулевым значением (возможно, это и есть проблема).

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

Как ни странно, когда я взаимодействую с приложением, используя "базовый сенсорный режим", проблема, кажется, уходит. Нет никаких вызовов к сеттеру из внешнего кода вообще.

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

Обновление: проблема сохраняется на устройстве surface даже после отключения сенсорной панели.

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

Если вы хотите получить дополнительную информацию, пожалуйста, оставьте комментарий, я постараюсь ответить как можно скорее.

Ниже приведен пример с жестко закодированными значениями, который ведет себя точно так же.

<ComboBox x:Name="IntervTypeComboBox" DisplayMemberPath="Label" <code></code> SelectedValuePath="Code"
                          Style="{StaticResource ComboStyle}"
                          ItemsSource="{Binding XYZ, Mode=TwoWay}"
                          ItemContainerStyle="{StaticResource ComboItemStyle}"
                          SelectedItem="{Binding SelectedXYZ, Mode=TwoWay}">
                    <ComboBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <VirtualizingStackPanel Orientation="Vertical" Width="{Binding ActualWidth, ElementName=IntervTypeComboBox}"/>
                        </ItemsPanelTemplate>
                    </ComboBox.ItemsPanel>
                </ComboBox>


        public ObservableCollection<KeyValueModel> XYZ
        {
            get
            {
                return _xyz;
            }
            set
            {
                if (Set(() => XYZ, ref _xyz, value))
                {
                    SelectedXYZ = XYZ.First();
                }
            }
        }

        public KeyValueModel SelectedXYZ
        {
            get { return _selectedXYZ; }
            set
            {
                Set(() => SelectedXYZ, ref _selectedXYZ, value);
            }
        }

        private void Constructor()
        {
                XYZ = new ObservableCollection<KeyValueModel> {
                new KeyValueModel { Code="Default", Label="-- Sélectionner --"},
                new KeyValueModel { Code="ABC", Label="ABC"},
                new KeyValueModel { Code="DEF", Label="DEF"},
                new KeyValueModel { Code="GHI", Label="GHI"}
                };
            SelectedXYZ = XYZ.FirstOrDefault(x => x.Code == "DEF");
}


Что я уже пробовал:

Я попытался поставить нулевую проверку на значение перед выполнением сеттера выбранного свойства элемента, но это не сработало.
Я пробовал изменить режим привязки элемента-источника с двухстороннего на одноразовый, тоже не получилось.
Затем я попытался изменить режим привязки выбранного элемента с двухстороннего на односторонний и использовать событие selection changed для обновления свойства модели представления, это плохая практика, и это не имеет никакого значения, я знаю, но я в отчаянии.

1 Ответов

Рейтинг:
2

Gerry Schmitz

Поместите "трассировку" в обработчик событий SelectionChanged для полей со списком и сравните то, что "ожидается", с тем, что происходит.


GKP1992

Я действительно пробовал и это, единственное отличие-необъяснимый вызов метода selection changed при использовании режима мыши.