Ответ 1
DisplayMemberPath
указывает путь к свойствам отображаемой строки для каждого элемента. В вашем случае вы установите его на "Name"
, а не "{Binding Name}"
.
Хорошо, я посмотрел на другие вопросы и, похоже, не получил ответа, надеюсь, кто-то здесь может.
Очень простой вопрос, почему свойство 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>
Но, на мой взгляд, это слишком много для такой простой задачи. Могу ли я использовать привязку родственников?
DisplayMemberPath
указывает путь к свойствам отображаемой строки для каждого элемента. В вашем случае вы установите его на "Name"
, а не "{Binding Name}"
.
Вы не привязываетесь к данным в классе, вы говорите ему, чтобы получить данные от члена класса, который назван именем участника, поэтому, если ваш экземпляр имеет item.Name == "steve"
, он пытается получить данные из item.steve
.
Чтобы это сработало, вы должны удалить привязку из MemberPath. Измените его на MemberPath = "Name"
, это говорит ему, чтобы получить данные от члена "Имя". Таким образом, он вызовет item.Name
, а не item.steve
.
Вы должны изменить MemberPath="{Binding Name}"
на MemberPath="Name"
. Тогда это сработает.
Вы можете удалить DisplayMemberPath, а затем установить путь в TextBlock.
DisplayMemberPath действительно подходит, если у вас нет ItemTemplate.
Или вы можете удалить свой ItemTemplate и использовать DisplayMemberPath - в этом случае он в основном создает для вас TextBlock.
Не рекомендуется, что вы оба.
<TextBlock text="{Binding Path=Name, Mode=OneWay}"
Кроме того, вам не нужно устанавливать DisplayMemberPath. вы можете просто включить переопределить ToString() в свой объект, который находится в вашем запросе. например:
class Prompt {
public string Name = "";
public string Value = "";
public override string ToString() {
return Name;
}
}
ToString() будет автоматически вызываться и отображать параметр Name из вашего класса. это работает для ComboBoxes, ListBoxes и т.д.