В WPF ComboBox, который DisplayMemberPath
хорошо, я посмотрел на другие вопросы и, похоже, не получил ответа, поэтому, надеюсь, кто-то здесь может.
очень простой вопрос, почему свойство DisplayMemberPath не привязывается к элементу?
<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" DisplayMemberPath="{Binding Name}" SelectedItem="{Binding Prompt}"/>
вывод трассировки показывает, что он пытается привязаться к классу, содержащему IEnumerable, а не фактический элемент в IEnumerable. Я запутался в простом способе заполнения combobox без добавления группы строк в xaml.
Он просто вызывает ToString () для объекта в itemssource. У меня есть работа, вокруг которой это:
<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" SelectedItem="{Binding Prompt}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
но на мой взгляд это слишком много для такой простой задачи. Можно ли использовать привязку relativesource?
5 ответов
DisplayMemberPath
указывает путь к свойству строки отображения для каждого элемента. В вашем случае вы бы установили его на "Name"
, а не "{Binding Name}"
.
вы не привязываетесь к данным в классе, вы говорите ему, чтобы получить его данные от члена класса, который назван членом "name", поэтому, если ваш экземпляр имеет item.Name == "steve"
Он пытается получить данные из item.steve
.
чтобы это работало, вы должны удалить привязку из MemberPath. Измените его на MemberPath = "Name"
это говорит о том, чтобы получить данные от члена "Name". Так он будет звать item.Name
, а не item.steve
.
вы можете удалить DisplayMemberPath, а затем установить путь в TextBlock.
DisplayMemberPath действительно для того, когда у вас нет ItemTemplate.
Или вы можете удалить ItemTemplate и использовать DisplayMemberPath - в этом случае он в основном создает TextBlock для вас.
Не рекомендуется делать и то, и другое.
<TextBlock text="{Binding Path=Name, Mode=OneWay}"
в качестве альтернативы вам не нужно устанавливать DisplayMemberPath. вы можете просто включить переопределение ToString () в свой объект, который находится в вашем PromptList. вот так:
class Prompt {
public string Name = "";
public string Value = "";
public override string ToString() {
return Name;
}
}
ToString () будет автоматически вызываться и отображать параметр Name из вашего класса. это работает для ComboBoxes, ListBoxes и т. д.