当有大量项目时,Windows手机列表框无法正常工作

时间:2015-08-27 10:29:32

标签: c# wpf windows-phone-8 listbox selecteditem

我在Windows Phone 8中使用Listbox来显示动态列表,我想在编辑模式中选择ListItem,并选择意味着我在列表中显示img。我能做到的。但是当我滚动列表时,我选择的项目会被更改。选择了其他一些项目。这是一种随机行为。 以下是我的代码。

 <ListBox x:Name="lstbxReg"
                 Margin="0 130 0 0"
                 Tap="lstbxReg_Tap"
                 VirtualizingStackPanel.VirtualizationMode="Standard"
                 >
            <ListBox.ItemTemplate >
                <DataTemplate>
                    <Border BorderThickness="1" 
                            BorderBrush="{Binding BorderColor}"
                            Margin="0 0 0 5"
                            Tag="lstRegBorder">
                        <StackPanel Width="380"  
                                  Tag="{Binding ID}"   >
                            <TextBlock Text="Date:" 
                                       Foreground="Black"
                                       FontWeight="SemiBold"
                                       FontSize="20"
                                       Padding="15 0 0 0"
                                       Width="150"
                                       Margin="0 0 0 -30"
                                       HorizontalAlignment="Left"/>
                            <!--/Assets/1.png-->
                            <Image x:Name="LstImg"
                                   Source="{Binding ImgURL}"
                                   Tag="{Binding ID}"
                                   Width="30" Height="25"
                                   Margin="0 5 10 0"
                                   Loaded="LstImg_Loaded"
                                   VirtualizingStackPanel.VirtualizationMode="Standard"
                                   HorizontalAlignment="Right"/>
                            <TextBlock x:Name="txtdate" 
                                       Text="{Binding Date}" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Margin="0 -30 30 0"
                                       Width="160"
                                       FontWeight="SemiBold"
                                       HorizontalAlignment="Right"/>
                            <TextBlock Text="Type:" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Padding="15 0 0 0"
                                       Width="150"
                                       HorizontalAlignment="Left"/>
                            <TextBlock x:Name="txtType" 
                                       Text="{Binding Category}" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Margin="0 -25 50 0"
                                       Width="140"
                                       HorizontalAlignment="Right"/>
                            <TextBlock Text="SMS No:" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Padding="15 0 0 0"
                                       Width="150"
                                       HorizontalAlignment="Left"/>
                            <TextBlock x:Name="txtSmsno" 
                                       Text="{Binding CustomerSMSNo}" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Margin="0 -25 50 0"
                                       Width="140"
                                       HorizontalAlignment="Right"/>
                            <TextBlock Text="Customer:" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Padding="15 0 0 0"
                                       Width="150"
                                       HorizontalAlignment="Left"/>
                            <TextBlock x:Name="txtCust" 
                                       Text="{Binding CustomerInfo}" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Margin="0 -25 50 0"
                                       Width="140"
                                       HorizontalAlignment="Right"/>
                            <TextBlock Text="Duration:" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Padding="15 0 0 0"
                                       Width="150"
                                       HorizontalAlignment="Left"/>
                            <TextBlock x:Name="txtDuration" 
                                       Text="{Binding Total}" 
                                       Foreground="Black"
                                       FontSize="16"
                                       Margin="0 -25 50 0"
                                       Width="140"
                                       HorizontalAlignment="Right"/>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

******代码*****

public void bind()
    {
        List<Class> lst = new List<Class>();

        for (int i = 1; i < 20; i++)
        {
            lst.Add(new Class
            {
                ID = i,
                BorderColor = "Green",
                URL = "/Assets/1.png",
                Date = DateTime.Today.ToString(),
                Category = "wr",
                CustomerSMSNo = "134578",
                CustomerInfo = "asd",
                Total = "12"
            });
        }

        lstbxReg.ItemsSource = lst;

    }

    private void lstbxReg_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        var selectedItemList = (Class)lstbxReg.SelectedItem;

        position = lstbxReg.SelectedIndex;
        var selected = (Class)lstbxReg.SelectedItem;
        if (selected.imgURL == "/Assets/1.png")
        {
            selected.imgURL = "/Assets/checkbox_Filled_green.png";


            int index = lstImg.FindIndex(x => x.Tag.ToString() == selected.ID.ToString());

            lstImg[index].Source = new BitmapImage(new Uri(selected.imgURL, UriKind.Relative));

        }
        else
        {
            selected.imgURL = "/Assets/1.png";


            int index = lstImg.FindIndex(x => x.Tag.ToString() == selected.ID.ToString());

            lstImg[index].Source = new BitmapImage(new Uri(selected.imgURL, UriKind.Relative));

        }
        lstbxReg.SelectedItem = null;
        lstbxReg.SelectedIndex = 0;
    }

    private void LstImg_Loaded(object sender, RoutedEventArgs e)
    {

        Img = sender as Image;
        int count = lstImg.FindAll(x => x.Tag.ToString() == Img.Tag.ToString()).Count;
        if (count == 0)
        {
            lstImg.Add(Img);
        }
    }

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

这不是一个随意的事情。

Listbox使用数据虚拟化。它仅创建有限数量的项目,这些项目在屏幕上同时可见。向下滚动时,它会重新使用向上滚动但不再可见的项目。

您正在使用数据绑定,这是一件好事。 但是您要对item的{​​{1}}进行更改,而不是对绑定的源列表进行更改。因此,只要Listbox收到更改通知,就可以在源列表中进行更改,Listbox将正确更新。

名为 lst 的源列表,您应该保留对它的引用以进行更改。

P.S。处理命名转换。一个名为 Class Listbox,并且大多数所有命名都混淆了,因此很难阅读。