WPF IsEditable=true Поле со списком, заполненное объектами, отображает toString() в качестве выбранного элемента
Вопрос
Поле со списком Wpf позволяет редактировать, и это нормально, если все элементы вашего поля со списком являются строками или для них определен метод toString().
Когда вы выбираете элемент, он отображается в виде текста, он не использует DataTemplate, он просто вызывает toString() для выбранного элемента.
Я получаю список элементов в моем выпадающем списке combo, которые отформатированы с использованием моего шаблона элемента, когда я выбираю один, я получаю имя объекта, т. е. Пространство имен.Имя моего объекта
Некоторые решения были
- используйте ValuePath для привязки к свойству объекта, но если вам требуется, чтобы ваше отображение было более чем одним из этих, не повезло.
- реализуйте метод toString() для вашего объекта
есть ли другой обходной путь?
Решение
Вы можете сделать это полностью в 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 объекта.
Другие советы
Вы можете использовать IValueConverter Преобразователь значений преобразовать "объект" в строковое значение и обратно.Смотрите пример кода по ссылке IValueConverter для получения подробной информации.