[英]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.