AutoCompleteBox has problem with items with same name

Русский заглоловок:Проблема выбора в AutoCompleteBox объектов с одинаковым свойством.

Поблема:
при отображении в AutoCompleteBox объектов, которые имеют одинаковые поля, AutoCompleteBox всегда будет выбирать только первый найденный (всегда один и тот же) объект из всех объектов с одинанковым полем. И это не смотря на то, что в выпадающем списке (выпадающей области) мы может отобразить любые нужные поля объекта сразу или даже DataGrid и увидеть отличия объектов.

Вот сразу простое и быстрое решение:
private void someInit()
{
    completeBox.SelectionChanged += AbonentsAutoCompleteBox_SelectionChanged;
    completeBox.Populated += new PopulatedEventHandler(completeBox_Populated);
}

void completeBox_Populated(object sender, PopulatedEventArgs e)
{
    var completeBox = sender as AutoCompleteBox;
    completeBox.Tag = null;
}
private void AbonentsAutoCompleteBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    fukcAutoAutoCompleteBoxDevelopersStupidPrinciplesInSelectionChanged(sender);
}
private static void fukcAutoAutoCompleteBoxDevelopersStupidPrinciplesInSelectionChanged(object sender)
{
    var completeBox = sender as AutoCompleteBox;
    if (completeBox.Tag == null)
    {
        completeBox.Tag = completeBox.SelectedItem;
        // this is correct state.
        // you can do some work there.

    }
    else
    {
        if (completeBox.SelectedItem != completeBox.Tag)
        {
            completeBox.SelectedItem = completeBox.Tag;
        }
        else
        {
            // this is correct state.
            // you can do some work there.

        }
    }
}
Как это работает:Мы выбираем второй, или третий и т.д. элемент и он становиться выбранным, как нам и надо и попадает в SelectedItem.
Зажигается событие SelectionChanged с нашим обработчиком.
После этого, не прекращая поток выполнения, код реализации AutoCompleteBox берет строковое значение поля выбранного нами объекта и производит по нему повторый поиск. В результатах поиска он берет первый элемент и проверят, отличается ли он от текущего SelectedItem. Ну ясен перец отличается, т.к. у них только поля похожие, поэтму он заменяет выбранный пользователем SelectedItem на только что найденый элемент. Каков мерзавец! :)
Из-за этого опять зажигается событие SelectionChanged в котором мы опять задаем через SelectedItem наш прежний закэшированный в .Tag выбранный пользователем объект.
После этого событие SelectionChanged опять сработает, уже по нашей вине.
В итоге мы получаем правильный выбранный элемент.
Почему так происходит:
В исходном коде AutoCompleteBox зашили такую подлянку, а легко бы могли подправить, чтоб такого не происходило.
Я, правда, тоже, бывает, так делаю :) , но легче соглашаюсь исправить что-либо.

Приамбула:
Разработчики AutocompleteBox начхали на разарботчиков-потребителей, заявив, что надо использовать объекты, которые не предоставляют одинаковых полей. Хорошая позиция.

Исходник проблемы:
AutoCompleteBox has problem with items with same name

P.S. Натравить бы на разработчиков AutoCompleteBox парочку тестеров, чтоб они объяснили им что к чему в этой жизни.

Комментарии

Популярные сообщения из этого блога

A4tech. Мышь не найдена. Пожалуйста, подсоедините мышь.

SVN: Пропали иконки TortoiseSVN.

Вывод в cmd или bat пустой строки.