views:

686

answers:

1

I've spent a few minutes searching on Google and have not found anything related to this issue I'm having:

Today I upgraded to the Silverlight 3 SDK and converted a project that I'm working on. I then noticed a bug in my program with a Listbox that has a Checkbox as its DataTemplate.

When one or more items is checked, and I scroll up and down, it seems that a few of the Checkboxes at the extremes get checked off and on randomly. This does not trigger the Checked/Unchecked event, however.

Has anyone seen this behavior? I'm not doing anything out of the ordinary, simply scrolling up and down once at least one checkbox has been checked, and a couple of others that I have not touched seem to get checked on and off repeatedly. This was definitely not happening with the Silverlight 2 SDK.

Here's the XAML definition for my Listbox:

<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>
+3  A: 

I suspect your problem is a result of ListBox (in SL3) now using an ItemCollectionGenerator. The concept behind this is that not all the objects found in the source data collection need to have had their corresponding instance of the DataTemplate created and added to the Visual Tree. As you scroll toward the bottom items that may soon be needed are created. Additionally items that have already be created but are now scrolled quite same way out of view can be removed. If the user scrolls up they are re-created.

If this is the case then the IsChecked state of any checkbox in this list will be lost at some point for large lists. To solve this you would need include a property in the data type to which you can bind IsChecked. Hence as ListBox re-creates items it correctly assigns the IsChecked value.

AnthonyWJones
Looks like you were correct sir. Even though my check box list was only about 15 items, the issue was in fact exactly what you described. Items were being removed and added to the Visual Tree and with no Property attached to IsChecked, it would just randomly check on/off items. I created a KVP class and binded the properly like you suggested and it fixed the issue.Many thanks!
Overhed