Таинственная красная рамка появляется вокруг 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 путем удаления каждой привязки для сбора элементов, если оно включено/отключено как выбранное, затем начать тестирование для привязки для коллекции.