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