Имеем XAML:
а вот теперь начинается магия, выбираем элемент 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();
}
}
Если кто-нибудь нашел более изящное решение, то прошу ответить, спасибо.
Комментариев нет:
Отправить комментарий