滚动时Silverlight 3 Checkbox Listbox错误?

时间:2009-10-09 19:56:20

标签: silverlight silverlight-3.0

我花了几分钟在Google上搜索,但没有发现任何与此问题有关的内容:

今天我升级到Silverlight 3 SDK并转换了我正在处理的项目。然后我注意到我的程序中有一个错误框,其中包含一个Checkbox作为其DataTemplate。

当选中一个或多个项目,并且我上下滚动时,似乎极端的一些Checkbox会随机检查并打开。但是,这不会触发Checked / Unchecked事件。

有没有人见过这种行为?我没有做任何与众不同的事情,只需在选中至少一个复选框后上下滚动,而其他几个我没有碰过的东西似乎反复检查和关闭。 Silverlight 2 SDK绝对不会发生这种情况。

这是我的列表框的XAML定义:

<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>

2 个答案:

答案 0 :(得分:5)

ListBox的默认ItemsPanel是VirtualizingStackPanel。您可以将其更改为使用StackPanel,这样您的问题就解决了。 使用此代码:

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

答案 1 :(得分:4)

我怀疑你的问题是ListBox(在SL3中)现在使用ItemCollectionGenerator的结果。这背后的概念是,并非源数据集合中找到的所有对象都需要创建相应的DataTemplate实例并将其添加到Visual Tree中。当您向底部滚动时,可能会很快创建可能需要的项目。此外,可以删除已经创建但现在以非常相同的方式滚动的项目。如果用户向上滚动,则会重新创建它们。

如果是这种情况,那么此列表中任何复选框的IsChecked状态将在某些时候丢失大型列表。要解决此问题,您需要在数据类型中包含一个可以绑定IsChecked的属性。因此,当ListBox重新创建项目时,它会正确分配IsChecked值。