2009-10-09 31 views
5

Tôi đã dành một vài phút tìm kiếm trên Google và đã không tìm thấy bất cứ điều gì liên quan đến vấn đề này, tôi đang gặp:Lỗi đèn hộp danh sách Silverlight 3 Hộp kiểm khi cuộn?

Hôm nay tôi nâng cấp lên Silverlight 3 SDK và chuyển đổi một dự án mà tôi đang làm việc trên. Sau đó tôi nhận thấy một lỗi trong chương trình của tôi với một Listbox có một Checkbox như DataTemplate của nó.

Khi một hoặc nhiều mục được chọn và tôi cuộn lên và xuống, có vẻ như một số hộp kiểm ở cực đoan được kiểm tra và bật ngẫu nhiên. Tuy nhiên, điều này không kích hoạt sự kiện Checked/Unchecked.

Có ai đã xem hành vi này không? Tôi không làm bất cứ điều gì trong số bình thường, chỉ cần di chuyển lên và xuống một khi ít nhất một hộp kiểm đã được kiểm tra, và một vài người khác mà tôi đã không chạm dường như để có được kiểm tra và tắt liên tục. Điều này chắc chắn không xảy ra với Silverlight 2 SDK.

Đây là định nghĩa XAML cho Listbox của tôi:

<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

Damn. Tôi ước tôi đã tìm thấy câu hỏi của bạn trước đây. Nó sẽ giúp tôi tiết kiệm rất nhiều thời gian. – Jehof

Trả lời

4

tôi nghi ngờ vấn đề của bạn là kết quả của ListBox (trong SL3) bây giờ sử dụng một ItemCollectionGenerator. Khái niệm đằng sau điều này là không phải tất cả các đối tượng tìm thấy trong bộ sưu tập dữ liệu nguồn cần phải có thể hiện tương ứng của DataTemplate được tạo và thêm vào Visual Tree. Khi bạn di chuyển về phía các mục dưới cùng có thể cần sớm được tạo. Ngoài ra các mục đã được tạo nhưng hiện được cuộn theo cách tương tự ra khỏi chế độ xem có thể bị xóa. Nếu người dùng cuộn lên, họ sẽ được tạo lại.

Nếu trường hợp này xảy ra thì trạng thái IsChecked của bất kỳ hộp kiểm nào trong danh sách này sẽ bị mất tại một số thời điểm cho danh sách lớn. Để giải quyết điều này, bạn sẽ cần bao gồm một thuộc tính trong kiểu dữ liệu mà bạn có thể ràng buộc IsChecked. Do đó khi ListBox tạo lại các mục, nó gán giá trị IsChecked một cách chính xác.

+0

Có vẻ như bạn đã đúng. Mặc dù danh sách hộp kiểm của tôi chỉ có khoảng 15 mục, vấn đề thực ra chính xác là những gì bạn mô tả. Các mục đã được gỡ bỏ và thêm vào Visual Tree và không có thuộc tính gắn liền với IsChecked, nó sẽ chỉ ngẫu nhiên kiểm tra/tắt các mục. Tôi đã tạo một lớp KVP và gắn kết đúng như bạn đã đề xuất và nó đã khắc phục sự cố. Rất cám ơn! – Overhed

+0

Bạn có thể đưa ra một ví dụ về lớp của bạn trong phần câu trả lời không? Hoặc ngay tại đây: http://stackoverflow.com/questions/14703379/strange-behaviour-with-a-lot-of-data-in-listbox-and-checkbox-minimal-project-pr –

5

Mặt hàng mặc định của hộp danh sách là VirtualizingStackPanel. Bạn có thể thay đổi nó để sử dụng StackPanel, cách này bạn giải quyết vấn đề. Sử dụng mã này:

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

+1 - đây là những gì cố định nó cho tôi. Cảm ơn! –

+0

Tôi có nên sử dụng điều này thay vì hộp danh sách của mình không? Và đại diện cho nội dung của tôi? Hay tôi nên xác định điều này ở một nơi khác? –

+0

Bạn là người tiết kiệm cuộc sống – Kurren

Các vấn đề liên quan