[英]wp7 listbox element tap 'sender' object uniqueness
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,...)
你怎么看待这件事? 发送者可以参考许多元素吗?
你怎么看待这件事?
默认情况下,列表框控件会重用可视项以优化性能。 您可以根据需要将其关闭,但是对于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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.