2011-08-02 26 views

Respuesta

93
<ComboBox IsEditable="True" TextBoxBase.TextChanged="ComboBox_TextChanged" /> 

... debería hacerlo. (Suponiendo que desea algo que se activará cada vez que se realice un cambio en el texto, en lugar de cuando el usuario haya terminado de ingresar el texto. ¿En qué caso necesitaría otro evento? ¿Tal vez un evento LostFocus o algo?)

De todos modos, la razón por la que el XAML anterior funciona es que, cuando IsEditable se establece en verdadero, el ComboBox usa un TextBox para mostrar y editar el texto. El evento textChanged de TextBox es bubbling event, lo que significa que aparecerá en el árbol de elementos para que podamos manejarlo en el ComboBox.

El único bit 'difícil' es que ComboBox no expone un evento TextChanged pero sí puede definir un controlador para él usando un attached event (de ahí la sintaxis TextBoxBase.TextChanged).

(es probable que sea digno de mención por la totalidad, que si el cuadro combinado pasó a contener más de un cuadro de texto a continuación, el controlador se llama cada vez que alguno de ellos había cambiado su texto.)

+0

¿Por qué agregar un estilo a los recursos del combobox que apuntaba al tipo de TextBox y tener un setter de eventos para TextChanged no lograba lo mismo? Este fue mi primer pensamiento hasta que descubrí que no funcionaba. Su solución funciona, pero me preguntaba por qué mi alternativa no. –

+2

@MikeG: Buena pregunta. Creo que ese enfoque funcionaría, pero solo si el TextBox no tiene otro estilo aplicado. Sospecho que la plantilla de control de ComboBox establece un estilo en el TextBox que está anulando tu estilo. – IanR

+0

No he buscado en Snoop para ver si ese es el caso, pero apuesto a que está en lo correcto con la suposición de que el ComboBox está anulando el estilo predeterminado de TextBox. Tendría que imaginarme que el ComboBox usa el TextChanged internamente para su funcionalidad. Creo que su solución es "más correcta/completa" debido al hecho de que creo que aprovecha las propiedades adjuntas de forma tal que fueron diseñadas para ser utilizadas. –

14

Basado en el enfoque anterior que tenía una mirada al código generado (XAML).

<ComboBox x:Name="myComboBox" IsEditable="True"/> 

Agregue el código siguiente a la inicialización:

myComboBox.AddHandler(System.Windows.Controls.Primitives.TextBoxBase.TextChangedEvent, 
         new System.Windows.Controls.TextChangedEventHandler(ComboBox_TextChanged)); 

Esto funciona muy bien para mí, porque necesitaba un ComboBox reutilizable (lista desplegable SQL-Server) que encapsula todo el comportamiento.

+0

He encontrado que esto funciona muy bien para el evento TextChanged en particular, pero no funciona con el evento SelectionChanged, probablemente debido a la ambigüedad entre el evento SelectionChanged de ComboBox y el evento SelectionChanged de TextBox. ¿Es posible hacer algo similar para ese evento específico? –

Cuestiones relacionadas