Silverlight 3 Checkbox Listbox ошибка при прокрутке? - PullRequest
5 голосов
/ 09 октября 2009

Я провел несколько минут в поиске в Google и не нашел ничего, связанного с этой проблемой:

Сегодня я обновился до Silverlight 3 SDK и преобразовал проект, над которым работаю. Затем я заметил ошибку в моей программе со списком, который имеет флажок в качестве DataTemplate.

Когда один или несколько элементов отмечены, и я прокручиваю вверх и вниз, кажется, что некоторые из Флажков в крайних случаях отмечаются и включаются случайным образом. Однако это не вызывает событие 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 ]

5 голосов
/ 19 сентября 2012

Панелью ItemsPanel по умолчанию для ListBox является VirtualizingStackPanel. Вы можете изменить его, чтобы использовать StackPanel, таким образом, ваша проблема решена. Используйте этот код:

<ListBox.ItemsPanel>
  <ItemsPanelTemplate>
     <StackPanel />
  </ItemsPanelTemplate>
<ListBox.ItemsPanel>
4 голосов
/ 11 октября 2009

Я подозреваю, что ваша проблема является результатом ListBox (в SL3), который теперь использует ItemCollectionGenerator. Концепция заключается в том, что не всем объектам, найденным в исходной коллекции данных, необходимо создать соответствующий экземпляр DataTemplate и добавить его в дерево визуалов. По мере прокрутки к нижним элементам, которые могут скоро понадобиться, создаются. Кроме того, элементы, которые уже были созданы, но теперь прокручиваются совершенно таким же образом, могут быть удалены. Если пользователь прокручивает вверх, он воссоздается.

Если это так, то состояние IsChecked любого флажка в этом списке в какой-то момент будет потеряно для больших списков. Чтобы решить эту проблему, вам нужно включить свойство в тип данных, к которому вы можете привязать IsChecked. Следовательно, поскольку ListBox повторно создает элементы, он правильно присваивает значение IsChecked.

...