wp7 listbox元素点击'sender'对象的唯一性

时间:2012-11-16 17:24:42

标签: c# windows-phone-7 listbox

与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"
   });

所以,让我们点击第零个太阳图像:

image 1

一切都好!让我们继续,然后点击第二张图片:

image 2

对,阳光明媚......但是......停下来,那是什么? 0_o

enter image description here

我没有点击这个项目,但是这个图像已经改变了!这不仅发生在项目上,也发生在其他一些随机项目(53,81,...)

您如何看待这个?发件人可以参考很多元素吗?

1 个答案:

答案 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;
}