DisplayMemberPath в ComboBox не работает, но привязка кажется корректной, не удается отобразить DisplayMemberPath
Сегодня я потратил так много времени на эту проблему, что публикую ее как вопрос, а затем публикую ответ, чтобы вы могли избежать такого же разочарования, которое я пережил за последние 183 минуты.
Вот простая версия моего исходного кода (возможно, ваша выглядит так)
.xaml (просмотр):
<ComboBox SelectedItem="{Binding WindDirection}" ItemsSource="{Binding WindDirections}" DisplayMemberPath="DisplayText" IsEditable="False"/>
.cs (ViewModel):
public class WindDirectionViewModel{
//I realize that there may be problems in this code, it's not my real code, just a quick sample
...code
List<WindDirectionObject> WindDirections = new List<WindDirectionObject>();
WindDirectionObject WindDirection = new WindDirectionObject();
...code
public string DisplayText = WindDirections.First(x => x.Equals(WindDirection)).DisplayString;
...code
}
Весь код работает отлично, и тот же (.cs) ViewModel даже корректно отображается в другом (.xaml) представлении, но в этом представлении он работает неправильно. Точная проблема в том, что при первом открытии представления в ComboBox нет текста, хотя DisplayText имеет значение! Точки останова показывают, что значение DisplayText правильно вычисляется и все, но это значение не будет отображаться при первом открытии представления.
1 ответ
Если вы используете DisplayMemberPath
атрибут в поле со списком.xaml - вы должны поместить ItemsSource
атрибут перед SelectedItem
атрибут в.xaml... или DisplayMemberPath
значение не отображается.
До:
<ComboBox ItemsSource="{Binding WindDirections}" SelectedItem="{Binding WindDirection}" DisplayMemberPath="DisplayText" IsEditable="False"/>
После:
<ComboBox SelectedItem="{Binding WindDirection}" ItemsSource="{Binding WindDirections}" DisplayMemberPath="DisplayText" IsEditable="False"/>
Bam. Работает отлично. Это может не решить вашу проблему, но, безусловно, решило мою... надеюсь, это ускорит ваше время разработки.:)