Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

вторник, 8 декабря 2009 г.

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 парочку тестеров, чтоб они объяснили им что к чему в этой жизни.

Комментариев нет:

Отправить комментарий