Ove*_*hed 5 silverlight silverlight-3.0
我花了几分钟在Google上搜索,但没有发现任何与此问题有关的内容:
今天我升级到Silverlight 3 SDK并转换了我正在处理的项目.然后我注意到我的程序中有一个错误框,其中包含一个Checkbox作为其DataTemplate.
当一个或多个项目被选中时,我向上和向下滚动,似乎极端的一些复选框被随机检查和关闭.但是,这不会触发Checked/Unchecked事件.
有没有人见过这种行为?我没有做任何与众不同的事情,只需在选中至少一个复选框后上下滚动,而其他几个我没有碰过的东西似乎反复检查和关闭.Silverlight 2 SDK绝对不会发生这种情况.
这是我的Listbox的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>
Run Code Online (Sandbox Code Playgroud)
小智 5
ListBox的默认ItemsPanel是VirtualizingStackPanel.您可以将其更改为使用StackPanel,这样您的问题就解决了.使用此代码:
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
<ListBox.ItemsPanel>
Run Code Online (Sandbox Code Playgroud)
我怀疑你的问题是 ListBox(在 SL3 中)现在使用ItemCollectionGenerator. 这背后的概念是,并非源数据集合中找到的所有对象都需要创建相应的 DataTemplate 实例并将其添加到可视化树中。当您滚动到底部时,可能很快需要的项目就会被创建。此外,已经创建但现在以完全相同的方式滚动到视图之外的项目可以被删除。如果用户向上滚动,它们就会被重新创建。
如果是这种情况,那么对于大型列表,此列表中任何复选框的 IsChecked 状态都将在某个时刻丢失。为了解决这个问题,您需要在可以绑定的数据类型中包含一个属性IsChecked。因此,当 ListBox 重新创建项目时,它会正确分配IsChecked值。