我在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);
}
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
这不是一个随意的事情。
Listbox
使用数据虚拟化。它仅创建有限数量的项目,这些项目在屏幕上同时可见。向下滚动时,它会重新使用向上滚动但不再可见的项目。
您正在使用数据绑定,这是一件好事。
但是您要对item
的{{1}}进行更改,而不是对绑定的源列表进行更改。因此,只要Listbox
收到更改通知,就可以在源列表中进行更改,Listbox
将正确更新。
名为 lst 的源列表,您应该保留对它的引用以进行更改。
P.S。处理命名转换。一个名为 Class 的Listbox
,并且大多数所有命名都混淆了,因此很难阅读。