2

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

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

图 1

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

图 2

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

在此处输入图像描述

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

你怎么看待这件事?发件人可以参考许多元素吗?

4

1 回答 1

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;
}
于 2012-11-16T23:31:41.443 回答