我花了几分钟在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>
答案 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
值。