2013-08-10 17 views
9

ho questo:Controllare se un ComboBox contiene elemento

<ComboBox SelectedValuePath="Content" x:Name="cb"> 
    <ComboBoxItem>Combo</ComboBoxItem> 
    <ComboBoxItem>Box</ComboBoxItem> 
    <ComboBoxItem>Item</ComboBoxItem> 
</ComboBox> 

Se uso

cb.Items.Contains("Combo") 

o

cb.Items.Contains(new ComboBoxItem {Content = "Combo"}) 

restituisce False.

qualcuno può dirmi come faccio a controllare se un nome ComboBoxItemCombo esiste nel ComboBoxcb?

+2

Il ComboBox non ha un nome, quindi come lo stai riferendo? – Paparazzi

+0

È consigliabile pubblicare il codice che riproduce il problema. – Paparazzi

+3

Se si sta cercando la velocità, collegare la sorgente a un HashSet di stringa e verificare se HashSet contiene la stringa. Se hai bisogno di inserimenti e cancellazioni dinamiche, allora ObservableCollection. L'utilizzo del ComboBox come raccolta non è ottimale. – Paparazzi

risposta

12

Articoli è un ItemCollection e not list of strings. Nel tuo caso è un collection of ComboboxItem e devi controllare la sua proprietà Content.

cb.Items.Cast<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo")); 

O

cb.Items.OfType<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo")); 

È possibile effettuare il ciclo su ogni elemento e rompere nel caso in cui avete trovato elemento desiderato -

bool itemExists = false; 
foreach (ComboBoxItem cbi in cb.Items) 
{ 
    itemExists = cbi.Content.Equals("Combo"); 
    if (itemExists) break; 
} 
+0

E cosa ti fa pensare che ciò influirà sulle prestazioni? –

+0

Devo farlo più volte al secondo. Rallenta la GUI. – Elmo

+0

Non ho capito. Anche 'Contiene' scorre internamente all'intero elenco finché non trova un elemento desiderato. –

3

Se si desidera utilizzare la funzione di Contains come in cb.Items.Contains("Combo") avete per aggiungere stringhe al tuo ComboBox, non a ComboBoxItem: cb.Items.Add("Combo"). La stringa verrà visualizzata esattamente come un oggetto ComboBox.