Edytowalny ComboBox z powiązaniem z wartością, której nie ma na liście

81

Mam edytowalny zestaw combo, w którym nie zawsze preferowany element znajduje się na liście rozwijanej.

Chciałbym mieć możliwość ręcznego wpisywania tekstu w polu tekstowym, który jest propagowany do ciągu powiązanego z SelectedValue.

W tej chwili ciąg powiązany z SelectedValue jest aktualizowany tylko wtedy, gdy wprowadzona wartość jest jedną z tych w elementach ComboBox.

Jak zezwolić na ręczne wprowadzanie i prawidłowe propagowanie wartości niestandardowych niedostępnych na liście ComboBox do wartości powiązanej?

ronag
źródło

Odpowiedzi:

135

Robiłem to wczoraj i dziś i wygląda to następująco:

  1. ustawić combobox IsEditable="true"

  2. zamiast wiązać się z SelectedItem, powiąż z Textwłaściwością combobox

  3. jeśli wiążesz się z obiektem niestandardowym, a nie tylko napisami, musisz również ustawić TextSearch.TextPath="NameOfField". Pozwala to na działanie funkcji wyszukiwania tekstu, a także wyświetla tę właściwość w polu tekstowym.

W sumie skończyło się na czymś takim:

<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}" />
John Gardner
źródło
4
Och, a jeśli nie używasz ItemTemplate, możesz użyć DisplayMemberPath = "Name" zamiast używać DataTemplate.
John Gardner,
28

Wystarczy ustawić powiązanie na właściwość Text w Combo.

<ComboBox  IsTextSearchEnabled="True"    IsEditable="True" 
ItemsSource="{Binding Items}" Text="{Binding SelectedItemText, Mode=TwoWay}" />
Rauld
źródło
1
Doskonale sprawdza się w przypadku wiązania z listą strun.
Herman Cordes