2011-08-26 10 views
6

Para aclarar Tengo un cuadro combinado con una colección observable unido a su propiedad ItemSource. Quiero que el usuario pueda escribir solo los elementos que están presentes en la colección. manteniendo el¿Cómo limito la entrada del usuario en un cuadro combinado, De modo que u sólo puede escribir las palabras que se encuentran dentro de la colección?

IsTextSearchEnabled="true" 

Funcionalidad. Así que he estado buscando en línea un ejemplo sobre cómo hacer esto. Hasta ahora pensé que debería usar el

<ComboBox TextInput="cbb1_TextInput" /> 

Evento y luego buscar en la colección. Pero mi intento débil no puede mantener la característica de autocompletar, el índice seleccionado se mezcla y otros comportamientos no deseados. Como soy bastante novato en wpf, me pregunto si hay soluciones que solo utilicen la parte XAML.

EDIT: he intentado algo como esto:

 private void fase1cbb1_KeyUp(object sender, KeyEventArgs e) 
    { 
     ComboBox cb = (ComboBox)sender; 
     bool match = false; 
     TextBox tb = (TextBox)cb.Template.FindName("PART_EditableTextBox", cb); 
     if (tb.Text.Length > 0) 
     { 
      foreach (MenuItem MI in cb.Items) 
      { 
       if (MI.Text.StartsWith(tb.Text)) 
       { 
        match = true; ; 
       } 
      } 
      if (!match) 
      { 
       int len = tb.Text.Length; 
       if (len > 0) 
       { 
        tb.Text = tb.Text.Substring(0, len - 1); 
        tb.SelectionStart = len; 

       } 
      } 
     } 
    } 

Pero tan pronto como no existe ninguna coincidencia ya no hay más elemento seleccionado, y no más de autocompletar/TEXTSEARCH.

thnx para cualquier consejo o ejemplos.

SOLUCIÓN: WPF ComboBox with IsEditable="True" - How can I indicate that no match was found?

+0

Yo no usaría el evento KeyUp. ¿No hay un BeforeValueChange o algo como esto? (no estoy seguro, la mayoría de las veces uso infragistics). Si es así, puedes verificar si el nuevo texto coincide con un elemento. Si no lo hace, cancela el evento de cambio de texto. – Tipx

Respuesta

2

Si se desplaza todo el camino hasta la parte inferior de la documentación ComboBox en MSDN encontrará que hay una muy simple respuesta posible: configurar su ComboBox.IsEditable en false. El usuario aún puede seleccionar elementos en el editor escribiendo el prefijo en el cuadro, pero solo podrán ingresar valores que ya aparecen en la lista.

El inconveniente es que no obtiene el comportamiento normal de "Cuadro de texto", en particular, no puede copiar/pegar el elemento seleccionado fuera del cuadro combinado. Si eso es también un problema para usted, háganoslo saber, pero que es el comportamiento típico de estilo ComboBoxes DropDownList de Windows de todos modos.

+0

Buena sugerencia, lo probé y es casi lo que estoy buscando. Solo que ahora el usuario no puede ver lo que escribe. ¿Es esto posible cuando IsEditable = falso? – Daanvl

Cuestiones relacionadas