Редактируемый ComboBox с привязкой к значению не в списке

81

У меня есть редактируемое поле со списком, где не всегда предпочтительный элемент находится в раскрывающемся списке.

Я хотел бы иметь возможность вручную вводить текст в текстовое поле, которое распространяется на строку, привязанную к SelectedValue.

Прямо сейчас строка, привязанная к SelectedValue, обновляется только в том случае, если введенное значение совпадает с значениями в элементах ComboBox.

Как разрешить вручную вводить пользовательские значения, недоступные в списке ComboBox, и правильно распространять их на связанное значение?

Ронаг
источник

Ответы:

135

Я делал это вчера и сегодня, и это выглядит так:

  1. установить поле со списком IsEditable="true"

  2. вместо привязки к SelectedItem, привязать к Textсвойству combobox

  3. если вы привязываетесь к настраиваемому объекту, а не только к строкам, вам также необходимо установить TextSearch.TextPath="NameOfField". Это позволяет работать с поведением текстового поиска, а также показывает это свойство в текстовом поле.

В итоге получилось что-то вроде:

<ComboBox x:Name="c" 
          IsEditable="True" 
          IsTextSearchEnabled="True" 
          IsTextSearchCaseSensitive="False" 
          StaysOpenOnEdit="True"
          Text="{Binding NameOnViewModel}"
          TextSearch.TextPath="NameOnChildItems"  
          ItemsSource="{Binding Items}" 
          ItemTemplate="{StaticResource DataTemplate}" />

<TextBlock Text="{Binding ElementName=c,Path=Text}" />
Джон Гарднер
источник
4
о, и если вы не используете ItemTemplate, вы можете использовать DisplayMemberPath = "Name" вместо использования DataTemplate.
Джон Гарднер
28

Также будет достаточно установки привязки к свойству Text для Combo.

<ComboBox  IsTextSearchEnabled="True"    IsEditable="True" 
ItemsSource="{Binding Items}" Text="{Binding SelectedItemText, Mode=TwoWay}" />
Раульд
источник
1
Прекрасно работает найти для привязки к списку строк.
Герман Кордес