Подтвердить что ты не робот

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>

Но, на мой взгляд, это слишком много для такой простой задачи. Могу ли я использовать привязку родственников?

4b9b3361

Ответ 1

DisplayMemberPath указывает путь к свойствам отображаемой строки для каждого элемента. В вашем случае вы установите его на "Name", а не "{Binding Name}".

Ответ 2

Вы не привязываетесь к данным в классе, вы говорите ему, чтобы получить данные от члена класса, который назван именем участника, поэтому, если ваш экземпляр имеет item.Name == "steve", он пытается получить данные из item.steve.

Чтобы это сработало, вы должны удалить привязку из MemberPath. Измените его на MemberPath = "Name", это говорит ему, чтобы получить данные от члена "Имя". Таким образом, он вызовет item.Name, а не item.steve.

Ответ 3

Вы должны изменить MemberPath="{Binding Name}" на MemberPath="Name". Тогда это сработает.

Ответ 4

Вы можете удалить DisplayMemberPath, а затем установить путь в TextBlock.
DisplayMemberPath действительно подходит, если у вас нет ItemTemplate.
Или вы можете удалить свой ItemTemplate и использовать DisplayMemberPath - в этом случае он в основном создает для вас TextBlock. Не рекомендуется, что вы оба.

   <TextBlock text="{Binding Path=Name, Mode=OneWay}" 

Ответ 5

Кроме того, вам не нужно устанавливать DisplayMemberPath. вы можете просто включить переопределить ToString() в свой объект, который находится в вашем запросе. например:

class Prompt {
    public string Name = "";
    public string Value = "";

    public override string ToString() {
        return Name;
    }
}

ToString() будет автоматически вызываться и отображать параметр Name из вашего класса. это работает для ComboBoxes, ListBoxes и т.д.