Вокруг ComboBox появляется таинственная красная рамка - PullRequest
20 голосов
/ 12 ноября 2010

У меня есть приложение 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 для выпадающего текста.

Ответы [ 5 ]

27 голосов
/ 28 июля 2012

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

У меня было это «таинственное красное поле», когда я привязался к списку 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)'
1 голос
/ 03 июня 2016

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

0 голосов
/ 20 февраля 2019

У меня была такая же проблема.Это оказалось несоответствием данных.Выбранный в выпадающем списке элемент был отображен в строку, а выбранное значение - в байт.Как только я преобразовал оба в строку, это работало как ожидалось.

0 голосов
/ 07 сентября 2016

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

0 голосов
/ 25 мая 2012

Должно ли выбранное значение не быть членом коллекции, а не самой коллекцией папок?то есть Folders.Folder.ID или что-то в этом роде?

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

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

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

...