В 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}" 

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


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

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

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

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