Снова откройте всплывающее окно Silverlight AutoCompleteBox без перезагрузки предложений от веб-службы. - PullRequest
1 голос
/ 07 ноября 2011

У меня есть 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)?

1 Ответ

1 голос
/ 08 ноября 2011

Ну, я попробовал IsDropDownOpen с битом тестирования, и почти сработало:

private void FoodBox_MouseEnter(object sender, MouseEventArgs e)
    {            
        //FoodBox.PopulateComplete();  not working after acb loses focus...            

        testbit = true;
        FoodBox.IsDropDownOpen = true;        
    }

Вот перегруженный метод Заполнения (не нужно явно устанавливать ItemsSource, потому что он привязан к ObservableCollection):

public void FoodBox_Populating(object sender, PopulatingEventArgs e)
    {
        e.Cancel = true;            
        if (!testbit)
        {
            VM.LoadFoodSuggestions(FoodBox.SearchText);
        }
        else
        {
            testbit = false;
            FoodBox.PopulateComplete();
        } 
    }

Пока это работает хорошо, за исключением того, что поиск не начинается, потому что когда (в первый раз) вы наводите курсор мыши и выбираете acb, он устанавливает тестовый бит в значение true. Поэтому я добавил еще один обработчик событий, который заботится о том, чтобы каждый раз, когда пользователь вводит текст на клавиатуре, тестовый бит сбрасывался, гарантируя, что предложения регенерируются / перезагружаются после изменения пользователем SearchText, но не при выборе элемента из выпадающий:

private void FoodBox_TextChanged(object sender, RoutedEventArgs e)
    {
        testbit = false;
    } 

Я до сих пор не знаю, почему вызова PopulateComplete () недостаточно без установки IsDropDownOpen в Ture и установки в значение true, также задерживает раскрывающийся список примерно на время, указанное в MinimumPopulateDelay, но по крайней мере это дает мне функциональность, которую я хотел. (Возможно, поиск в источнике acb ответит на эту загадку)

Возможно, эта функциональность, реализованная в базовом acb, будет полезна в будущем выпуске элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...