【问题标题】:Silverlight 3 Checkbox Listbox bug when scrolling?Silverlight 3 Checkbox Listbox 滚动时出现错误?
【发布时间】:2009-10-09 19:56:20
【问题描述】:

我在 Google 上搜索了几分钟,但没有找到与我遇到的这个问题相关的任何内容:

今天我升级到 Silverlight 3 SDK 并转换了我正在处理的项目。然后我注意到我的程序中有一个错误,其中一个列表框有一个复选框作为它的数据模板。

当一个或多个项目被选中时,我上下滚动,似乎有几个处于极端的复选框被随机选中和选中。但是,这不会触发 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>

【问题讨论】:

  • 该死的。我希望我以前发现过你的问题。这会节省我很多时间。

标签: silverlight silverlight-3.0


【解决方案1】:

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

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

【讨论】:

  • 我应该用这个代替我的列表框吗? 代表我的内容?还是我应该在其他地方定义这个?
【解决方案2】:

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

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

【讨论】:

  • 看起来你是对的,先生。尽管我的复选框列表只有大约 15 项,但问题实际上正是您所描述的。项目被删除并添加到可视树中,并且没有附加到 IsChecked 的属性,它只会随机检查打开/关闭项目。我创建了一个 KVP 类并按照您的建议正确绑定了它,它解决了这个问题。非常感谢!
  • 你能在答案部分给出你的类的代码示例吗?或者就在这里:stackoverflow.com/questions/14703379/…
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多