2010-09-18 6 views
64

Ho una casella combinata modificabile in cui non sempre l'elemento preferito è nell'elenco a discesa.ComboBox modificabile con associazione al valore non in elenco

Mi piacerebbe avere la possibilità di inserire manualmente il testo nella casella di testo che viene propagato alla stringa associata a SelectedValue.

In questo momento la stringa associata a SelectedValue viene aggiornata solo se il valore inserito è su quelli negli elementi di ComboBox.

Come consentire l'inserimento manuale dei valori personalizzati non disponibili nell'elenco ComboBox e il loro corretto propagazione al valore associato?

risposta

106

Stavo solo facendo questo ieri, oggi e sembra che il seguente:

  1. impostare la casella combinata IsEditable="true"

  2. invece di legarsi a SelectedItem, si legano alla Text proprietà della casella combinata

  3. Se si esegue il binding a un oggetto personalizzato anziché solo a stringhe, è necessario impostare anche TextSearch.TextPath="NameOfField". Ciò consente al comportamento di ricerca del testo di funzionare e mostra anche questa proprietà nella casella di testo.

Tutto sommato, ho finito con qualcosa di simile:

<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}" /> 
+2

oh, e se non si utilizza ItemTemplate, è possibile utilizzare DisplayMemberPath = "Nome" anziché utilizzare un DataTemplate. –

+1

fantastico! Funziona anche per i numeri – Roberto

24

Impostazione del legame al testo della proprietà del Combo sarà sufficiente pure.

<ComboBox IsTextSearchEnabled="True" IsEditable="True" 
ItemsSource="{Binding Items}" Text="{Binding SelectedItemText, Mode=TwoWay}" /> 
+0

Lavori perfettamente trovati per il collegamento a un elenco di stringhe. –