与listboxitem内部发件人出现了一个奇怪的情况(我只是认为这个发件人应该受到指责,但不确定......)
ListBox有 ItemTemplate :
<ListBox x:Name="list">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="stack_panel">
<Image Source="{Binding ImageSource}" Tap="Image_Tap"></Image>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ListBox中的每个项目都有一个带点击事件的图像:
private void Image_Tap(object sender, GestureEventArgs e)
{
Image i = (Image)sender;
i.Source = new BitmapImage(new Uri("Images/yellow.png", UriKind.RelativeOrAbsolute));
}
此外,还有一个类可以轻松更改图片:
public class listItems
{
public string ImageSource { get; set; }
}
右。现在我准备在列表框中添加一些元素:
for (int i = 0; i < 100;i++)
list.Items.Add(new listItems
{
ImageSource = "Images/black.png"
});
所以,让我们点击第零个太阳图像:
一切都好!让我们继续,然后点击第二张图片:
对,阳光明媚......但是......停下来,那是什么? 0_o
我没有点击这个项目,但是这个图像已经改变了!这不仅发生在项目上,也发生在其他一些随机项目(53,81,...)
上您如何看待这个?发件人可以参考很多元素吗?
答案 0 :(得分:1)
您如何看待这个?
默认情况下,列表框控件会重复使用可视项目来优化性能。你可以根据需要将其关闭,但是对于100件物品,性能当然会下降。
有更好的解决方案。您应该将选择状态存储在模型中的某个位置,而不仅仅是在可视化树中,而不是您正在做的事情。
您的项目类可以是:
public class listItems: INotifyPropertyChanged
{
bool _selected = false;
public bool isSelected
{
get { return _selected; }
set
{
if( value == _selected )
return;
_selected = value;
var pc = this.PropertyChanged;
if( null != pc )
pc( this, new PropertyChangedEventArgs( "ImageSource" ) );
}
}
public string ImageSource { get { return _selected ? "Images/yellow.png" : "Images/black.png"; } }
public event PropertyChangedEventHandler PropertyChanged;
}
INotifyPropertyChanged接口允许可视树通知属性更改。
这是点击处理程序:
void Image_Tap( object sender, GestureEventArgs e )
{
Image img = (Image)sender;
listItems item = (listItems)img.DataContext;
item.isSelected = true;
}