Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

ComboBox DisplayMemberPath IsEditable и выбранный элемент

Имеем XAML:
ABCDE ABCD ABC AB A
а вот теперь начинается магия, выбираем элемент ABC в ComboBox и удалим с конца один символ, заливка белая, т.е. ComboBox считает что элемент выбран, а в тексте ComboBox говориться что выбран AB, хотя в TextBlock указывается что выбран элемент ABCDE
Итог получаем:
Выбираем один элемент, меняем текст на другой, а в SelectItem ComboBox получаем вообще третий элемент, причем пользователь об этом даже не узнает... (TextBlock в проекте нет, он создан лишь для демонстрации).


Ответ

В стиль ComboBox добавим Setter

и опишем сам конвертер, который будет в том числе работать и с DisplayMemberPath у ComboBox
public class HelpConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values.Length >= 2 && values[0] is IEnumerable && values[1] is string) { string displayString = null; if (values.Length >= 3 && values[2] is string) displayString = (string)values[2]; IEnumerable collection = (IEnumerable)values[0]; IEnumerator enumerator = collection.GetEnumerator(); string equalsText = (string)values[1]; while (enumerator.MoveNext()) { string elementDisplayString = null; if (string.IsNullOrWhiteSpace(displayString)) elementDisplayString = enumerator.Current?.ToString(); else { if (enumerator.Current != null) { System.Reflection.PropertyInfo p = enumerator.Current.GetType().GetProperty(displayString); if (p != null && p.CanRead) elementDisplayString = p.GetValue(enumerator.Current)?.ToString(); } } if (equalsText.Equals(elementDisplayString, StringComparison.InvariantCultureIgnoreCase)) return enumerator.Current; } } return null; }
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotSupportedException(); } }
Если кто-нибудь нашел более изящное решение, то прошу ответить, спасибо.

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

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