WPF IsEditable = true ComboBox, заполненный объектами, отображает ToString () как выбранный элемент - PullRequest
15 голосов
/ 04 декабря 2009

Поле со списком Wpf позволяет редактировать, и это нормально, если все элементы вашего поля со списком являются строками или для них определен метод ToString ().

Когда вы выбираете элемент, он отображается как текст, он не использует DataTemplate, он просто вызывает ToString () для выбранного элемента.

Я получаю список элементов в раскрывающемся списке, которые отформатированы с использованием моего шаблона элемента. Когда я выбираю один элемент, я получаю имя объекта, т.е.

Некоторые решения были

  • использовать ValuePath для привязки к свойству на объекте, но если вам требуется ваш дисплей будет больше, чем один это несчастье.
  • реализовать метод ToString () на ваш объект

Есть ли другой путь?

Ответы [ 2 ]

32 голосов
/ 18 февраля 2010

Вы можете сделать это полностью в Xaml

<ComboBox IsTextSearchEnabled="True" IsEditable="True"
        ItemsSource="{Binding MyObjectCollection}"
        TextSearch.TextPath="MyObjectName">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding MyObjectName}" />
        </DataTemplate>
     </ComboBox.ItemTemplate>
</ComboBox>

Положительным моментом является то, что вы можете определять и изменять это так, как вы хотите, в своем XAML без какого-либо кода. Вы связываете ItemsSource с вашей коллекцией объектов, а затем задаете путь, на котором будет основываться ваш поиск, с TextSearch.TextPath. Затем в вашем пользовательском ItemTemplate вы можете связать TextBlock с чем-то еще, кроме метода ToString объекта.

3 голосов
/ 04 декабря 2009

Вы можете использовать IValueConverter для преобразования "объекта" в строковое значение и обратно. Подробнее см. Пример кода в ссылке IValueConverter.

...