2011-02-16 20 views
5

¿Podría ayudarme a encontrar el error en este caso? El evento se desencadena antes de que se cargue el formulario de Windows. Empiezo a ver el cuadro de mensaje y luego hago clic en Aceptar, después de eso carga la pantalla principal. Después de que todo funciona perfectamente, me pregunto qué desencadena el evento ComboBox SelectionChanged incluso antes de cargar la ventana. FillComboBoxFamilyData (SegmentCode) solo crea un conjunto de datos y pone los valores en el ComboBox. Por favor, consulte este enlace para obtener el código completo.La selección de cuadro combinado cambió el evento sin cambiar la selección en el ComboBox

Not able to make cascading comboboxes work

Cualquier ayuda sería muy aprecie.

<ComboBox Height="23" HorizontalAlignment="Left" Margin="35,26,0,0" Name="comboBox1" VerticalAlignment="Top" Width="205" ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}" DisplayMemberPath="Segment Name" SelectedValuePath="Segment Code" SelectionChanged="comboBox1_SelectionChanged"/> 
<ComboBox Margin="304,26,395,93" Name="comboBox2" /> 


    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

     MessageBox.Show(comboBox1.SelectedValue.ToString()); 
     SegmentCode = Convert.ToInt32(comboBox1.SelectedValue.ToString()); 
     FillComboBoxFamilyData(SegmentCode); 

    } 
+0

tenía que escribir el código, nula comboBox1_SelectionChanged (object sender, SelectionChangedEventArgs e) privada, o fue la producida por un SDK? – clamchoda

Respuesta

14

En este momento se cargarán los datos (adjuntados por el enlace), se activará SelectionChanged. Por lo tanto, debe registrar su controlador de eventos si su aplicación está lista y se cargan y adjuntan todos los datos. Si no, devuelve el controlador de eventos sin hacer nada. Este comportamiento es por diseño.

ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}" 

Puede utilizar el IsLoaded -property para detectar, si la unión ya ha sido evaluado. IsLoaded no será cierto a menos que el motor de enlace de datos haya evaluado sus enlaces xaml.

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)  { 
    if(!IsLoaded){ 
     return; 
    } 
    .... your code here 
+0

Gracias HCL por la respuesta. – MangoTable

+0

Gracias HCL por la respuesta. Traté de poner el código en el evento SelectionChanged y no funcionó, creo que la razón es porque llega al código dentro del evento comboBoxSelection después de que se activa el evento, para ese momento los datos son ya cargado, por lo que se mueve y ejecuta el código. tenemos que detener la ejecución del evento selectionChanged mientras se está cargando windows. Me pregunto por qué incluso se dispara cuando la selección en el cuadro combinado ni siquiera se cambia. – MangoTable

0

tenía este mismo problema y descubrí que marcando el comienzo de selección de índice de la combox usando XAML se disparará el evento SelectionChanged cuando el programa es la carga que provoca el error.

Para resolverlo, puede establecer el índice de selección en -1 (valor predeterminado) O cambiar el índice de selección actual del cuadro combinado mediante el código una vez que se haya cargado el programa.

0

Sé que esta es una vieja pregunta, pero me encontré con dos veces tratando de solucionar esto en mi proyecto y tuve los mismos resultados que el OP. Mi lista se completa después de que IsLoaded sea verdadero. Entonces, pensé que publicaría lo que descubrí para los demás. Simplemente use el evento DropDowOpened para establecer un bool en verdadero. De esta forma, el evento SelectionChanged no se activará hasta que el usuario realmente haga clic en el menú desplegable.

private bool UserSeriesChange; 
private void comboBox1_DropDownOpened(object sender, EventArgs e) 
{ 
     UserSeriesChange = true;  
} 

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if(!UserSeriesChange){ 
     return; 
    } 
    .... your code here 
1

Puede usar la propiedad IsLoaded del cuadro combinado para comprobar si está cargado todavía. Esta es la solución más fácil y más limpio que podía encontrar:

var comboBox = (ComboBox)sender; 
if (!comboBox.IsLoaded) 
{ 
    // This is when the combo box is not loaded yet and the event is called. 
    return; 
} 
Cuestiones relacionadas