Таинственная красная рамка появляется вокруг ComboBox

У меня есть приложение WPF - XBAP - с ComboBox на главной странице. Когда я выбираю элемент в ComboBox, обработчик события перестраивает коллекцию, которая является источником данных для списка. Похоже на довольно простые вещи, все, что я делал в WPF раньше.

Вот как выглядит мое выпадающее меню после выбора элемента из списка:

WTF?

Откуда появилась красная граница? Я создаю форму с нуля, сейчас нет стиля или чего-то еще. Текст "красный" даже не упоминается нигде в проекте. Он не исчезнет, ​​как только появится, и появится над всем, что я помещаю поверх элемента управления.

Здесь разметка:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Converter={StaticResource ResourceKey=DeviceInfoNameConverter}}"></TextBlock>
    </DataTemplate>
</ComboBox.ItemTemplate>

Дополнительная информация:

  • Это приложение XBAP, работающее в IE8
  • Другие элементы выпадающего меню на той же странице не делают этого.
  • Граница исчезает, когда я пытаюсь проверить дерево управления с помощью Snoop
  • Конвертер не является источником проблемы, я попытался связать напрямую с объектом на базовом объекте, и окно все еще появляется.

Мое единственное предположение, что пока не выполняется поиск, заключается в том, что для элемента управления применяется какой-то шаблон ошибки по умолчанию. Я работаю с WIA, и есть несколько COM-исключений, которые появляются в окне вывода VS, по-видимому, связанных с привязкой данных для ListView. Источником данных для элемента управления является объект WIA.DeviceInfo, конвертер просто получает свойство name для выпадающего текста.

Ответы

Ответ 1

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

У меня было это "таинственное красное поле", когда я привязывал список decimal объектов, но мой тип свойства MVVM был int. Проверьте и дважды проверьте все свои свойства SelectedValue, DisplayMemberPath и SelectedValuePath если вы их используете, и убедитесь, что вы не используете SelectedValue когда вы намеревались использовать SelectedItem.

Посмотрите в консоли отладки ошибки привязки для чего-то вроде этого:

System.NotSupportedException: Int32Converter cannot convert from System.Decimal

System.Windows.Data Error: 7 : ConvertBack cannot convert value '7' (type 'Decimal'). BindingExpression:Path=SharedProductHistoryFilterCriteria.FilterDays; DataItem='PricingManagerViewModel' (HashCode=19425465); target element is 'ComboBox' (Name=''); target property is 'SelectedValue' (type 'Object') NotSupportedException:'System.NotSupportedException: Int32Converter cannot convert from System.Decimal.
   at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
   at MS.Internal.Data.ObjectTargetConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
   at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

Ответ 2

У меня тоже была такая же проблема, тогда я изменил типы данных как SelectedItem, так и ItemsSource, чтобы быть двойными. Раньше у меня был список int для ItemsSource и double для SelectedItem.It работает.

Ответ 3

Похоже, это просто проблема с типом. Для моего случая, SelectedIndex был связан с свойством типа Enum, и установщик этого свойства никогда не вызывался. Мне просто нужно было явно вернуть возвращаемое значение в правильный тип как в Convert, так и в ConvertBack моего конвертера.

Ответ 4

Если ваше выбранное значение не входит в коллекцию, а не в коллекцию Folders? i.e Folders.Folder.ID или что-то в этом направлении?

Таким образом, ваши объекты CBSource будут Folders и selectedItem будут Folder и selectedValue будет Name??????

вам нужно обновить SelectedValue до члена коллекции. Кроме того, вам нужно будет указать ItemsSource = {Binding Path = Folders} "t. Тогда вам нужно будет указать DisplayMemberPath и SelectedValuePath.

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