2009-10-09 12 views
5

He pasado unos minutos buscando en Google y no he encontrado nada relacionado con este problema Estoy teniendo:Silverlight 3 Casilla de verificación ¿Error de la caja de lista al desplazarse?

Hoy me actualicé a Silverlight 3 SDK y convertí un proyecto en el que estoy trabajando. Luego noté un error en mi programa con un Listbox que tiene un Checkbox como DataTemplate.

Cuando uno o más elementos están marcados, y me desplazo hacia arriba y hacia abajo, parece que algunas de las casillas de verificación en los extremos se marcan y se activan al azar. Sin embargo, esto no activa el evento Controlado/Desmarcado.

¿Alguien ha visto este comportamiento? No estoy haciendo nada fuera de lo normal, simplemente moviéndome hacia arriba y hacia abajo una vez que se ha verificado al menos una casilla de verificación, y un par de otras que no he tocado parecen activarse y desactivarse repetidamente. Esto definitivamente no sucedía con el SDK de Silverlight 2.

Aquí es la definición XAML para mi cuadro de lista:

<ListBox x:Name="cBoxSalesmen" Width="135" Height="200" 
HorizontalAlignment="Left" VerticalAlignment="Top"> 
<ListBox.Template> 
    <ControlTemplate> 
     <Border Style="{StaticResource BorderStyleThin}"> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock Text="Salesmen" /> 
       <ScrollViewer Height="176" VerticalScrollBarVisibility="Visible" > 
        <ItemsPresenter /> 
       </ScrollViewer> 
      </StackPanel> 
     </Border> 
    </ControlTemplate> 
</ListBox.Template> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Margin="0" Content="{Binding}" FontSize="10" HorizontalAlignment="Left" 
       Checked="SalesmenCheckbox_Checked" Unchecked="SalesmenCheckbox_Unchecked"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 
+0

Damn. Desearía haber encontrado tu pregunta antes. Me habría ahorrado mucho tiempo. – Jehof

Respuesta

4

Sospecho que su problema es el resultado del cuadro de lista (en SL3) ahora usando un ItemCollectionGenerator. El concepto detrás de esto es que no todos los objetos que se encuentran en la recopilación de datos de origen deben tener su instancia correspondiente del DataTemplate creado y agregado al Árbol Visual. A medida que se desplaza hacia la parte inferior, se crean los elementos que pueden necesitar pronto. Además, se pueden eliminar los elementos que ya se han creado pero que ahora se desplazan de la misma manera fuera de la vista. Si el usuario se desplaza, se vuelven a crear.

Si este es el caso, el estado IsChecked de cualquier casilla en esta lista se perderá en algún momento para listas grandes. Para resolver esto, debe incluir una propiedad en el tipo de datos al que puede enlazar IsChecked. Por lo tanto, como ListBox vuelve a crear elementos, asigna correctamente el valor IsChecked.

+0

Parece que tenía razón, señor. A pesar de que mi lista de casilla de verificación solo tenía 15 elementos, el problema era exactamente lo que usted describió. Los elementos se eliminaron y se agregaron al árbol visual y, sin propiedad adjunta a IsChecked, solo se verificaron aleatoriamente los elementos de encendido/apagado. Creé una clase KVP y enlacé correctamente como sugirió y solucionó el problema. ¡Muchas gracias! – Overhed

+0

¿Puedes dar un ejemplo de código de tu clase en la sección de respuestas? O aquí mismo: http://stackoverflow.com/questions/14703379/strange-behaviour-with-a-lot-of-data-in-listbox-and-checkbox-minimal-project-pr –

5

El Panel de elementos predeterminado de ListBox es VirtualizingStackPanel. Puede cambiarlo para usar el StackPanel, de esta manera su problema está resuelto. Utilice este código:

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
    <StackPanel /> 
    </ItemsPanelTemplate> 
<ListBox.ItemsPanel> 
+0

+1 - esto es lo que me lo arregló ¡Gracias! –

+0

¿Debo usar esto en lugar de mi listbox? ¿Y representa mi contenido? ¿O debería definir esto en otro lugar? –

+0

Eres un salvavidas – Kurren

Cuestiones relacionadas