В WPF ComboBox, для текст изменен не меняется selectedvalue
Привет,
Я использую элемент управления ComboBox в WPF UserControl. Я связал его с сущностью. Проблема в том, что если я набираю текст вручную (IsEditable = " True") текст иногда не совпадает со значением DisplayMemberPath выбранного значения.
Это мой код Xaml:
ItemsSource="{Binding Companies, Mode=OneWay}" DisplayMemberPath="Name" SelectedValue = "{Binding SelectedItem.CompanyId, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" SelectedValuePath="CompanyId" IsSynchronizedWithCurrentItem="True" IsEditable="True"
А это c# компании (ItemSource):
public class CompanyEntity : BaseEntity { public int? CompanyId { get; set; } public string Name { get { return GetValue(() => Name); } set { SetValue(() => Name,value); } } }
(где GetValue и SetValue воспроизводят OnNotifiPropertyChanged.)
Итак, если у меня есть эта компания:
CompanyId:1 Название: Microsoft
CompnayId:2 Название: Apple
Если я наберу вручную "Mi", то в выпадающем списке автоматически выберу " Microsoft (SelectedValue = 1, Text = Microsoft). Но если я удалю последнее слово, SelectedValue останется 1, а текст изменится на"Mi". Поэтому я выбрал значение, которое не соответствует компании с Id=1.
¿Кто-нибудь экспериментировал с этой проблемой и знает, как ее решить?
Что я уже пробовал:
Я попытался изменить SelectedValue вручную таким образом:
XAML-Код Выпадающего Списка :
TextBoxBase.TextChanged="ComboBox_TextChanged"
В C# код позади :
private void ComboBox_TextChanged(object sender, TextChangedEventArgs e) { if (sender is ComboBox) { ComboBox combo = sender as ComboBox; if (!String.IsNullOrWhiteSpace(combo.Text)) { if (combo.SelectedValue == null || (int)combo.SelectedValue == 0) return; else { var propertyInfo = combo.SelectedItem.GetType().GetProperty(combo.DisplayMemberPath); string value = propertyInfo.GetValue(combo.SelectedItem, null).ToString(); if (!value.Equals(combo.Text, StringComparison.OrdinalIgnoreCase)) { combo.SelectedValue = 0; } } } } }
Но в этом случае, когда я обновляю SelectedValue, он автоматически удаляет текст.
Другой вариант, который я пробовал, - это обновление текста после SelectedValue = 0, но затем курсор перемещается в начало, что приводит к плохому пользовательскому опыту.