WPF ComboBox не обновляет Text когда IsEditable
Есть ComboBox, проблем в том что когда он IsEditable="True" не работает обновление текста при изменении его в записи, если убрать то все работает. Почему?
<StackPanel>
<DockPanel>
<Button DockPanel.Dock="Right" Width="35" Height="35" Content="Click" Click="Button_Click"/>
<ComboBox DisplayMemberPath="Name" SelectedIndex="0" IsEditable="True" ItemsSource="{Binding Records}"/>
</DockPanel>
</StackPanel>
public class MainViewModel : NotifyPropertyChanged {
private ObservableCollection<Record> _records;
public ObservableCollection<Record> Records {
get => this._records;
set {
this._records = value;
OnPropertyChanged(nameof(this.Records));
}
}
public MainViewModel() {
this.Records = new ObservableCollection<Record>();
this.Records.Add(new Record() {
Name = "Test"
});
this.Records.Add(new Record() {
Name = "12345"
});
this.Records.Add(new Record() {
Name = "54321"
});
}
}
public class Record : NotifyPropertyChanged {
private string _name;
public string Name {
get => this._name;
set {
this._name = value;
OnPropertyChanged(nameof(this.Name));
}
}
}
public abstract class NotifyPropertyChanged : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string property) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
private void Button_Click(object sender, RoutedEventArgs e) {
((MainViewModel)this.DataContext).Records[0].Name = "AAAAA";
}
Ответы (1 шт):
Логика в этом поведении как раз есть.
Если ComboBox редактируемый, значение, показываемое в поле редактирования не имеет смысла автоматически синхронизировать с выбранным элементом, ведь юзер мог вбить туда своё значение. А затирать введённое юзером значение не комильфо.
Идея «затирать значение только если юзер его ещё не модифицировал» совсем плоха.
Что нужно делать? Смотря от того, чего вы хотите добиться. Нужно ли вам, чтобы комбобокс был редактируемым? Тогда текущее поведение выглядит правильно, с учётом возможности редактирования.
Если вы хотите в некоторых случаях затирать значение, которое установалено пользователем, то напишите логику, которая будет обновлять поле Text.
По сути, редактируемый и нередактируемый комбобоксы — это очень разные контролы, и поведение у них тоже разное.
