У меня есть AutoCompleteBox, привязанный к ObservableCollection ItemsSource, который я фильтрую самостоятельно, запрашивая сущности из службы домена.
Я использовал сценарий заполнения из вызова веб-службы из блога Джеффа Вилкокса, установив для параметра PopulationEventArgs.Cancel значение True, а когда моя коллекция готова, я вызываю PopulateComplete () в ACB.
Моя цель - снова открыть раскрывающийся список при наведении курсора мыши (или щелчке мышью), но без повторной загрузки всех данных из Интернета. Я нашел вопрос о stackoverflow, где ответом было установить IsDropDownOpen в True. Но в этом случае заполнение ACB начинается снова, и в веб-службу поступает другой вызов.
Конечно, когда пользователь начинает печатать, фильтрация должна быть выполнена снова.
(например, вы набираете «ric», и в поле предлагаются «рис» и «рицин», вы выбираете рис, но передумаете и хотите выбрать другой из той же коллекции, скажем, «рицин». В этом случае у вас уже есть предложения, содержащие "ric" в памяти, нет необходимости загружать их снова ..)
Я нашел альтернативный способ, при котором вместо установки IsDropDownOpen я просто вызываю метод PopulateComplete (). Это делает то же самое, что я хочу, но с небольшим сбоем: после того, как мой ACB теряет фокус, раскрывающийся список не открывается снова при наведении курсора мыши, как должно. Даже когда я нажимаю обратно в текстовое поле acb.
Так есть ли исправление для этого, или кто-то знает, почему PopulateComplete () открывает раскрывающийся список только тогда, когда ACB фокусируется в первый раз? Или только мне повезло, что при вызове этого метода был вновь открыт раскрывающийся список, и вместо него следует использовать свойство IsDropDownOpen (на самом деле это возможно только при некоторых флагах, указывающих, что это ложное заполнение, вызванное моим указателем мыши и после PopulationEventArgs.Cancel, которое я должен вызвать. немедленно PopulateComplete. но я не понимаю, если это может сработать (еще не пытался), почему бы не при вызове просто PopulateComplete)?