2012-11-16 61 views
2

曾與一個ListBoxItem內發送一個奇怪的情況(我只是認爲這發件人是不爭氣,但不知道...)WP7列表框元素,點擊「發送」對象的唯一性

的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

一切OK!讓我們繼續,並點擊第二個畫面:

image 2

權,太陽shining..but ..停止,那是什麼? 0_o

enter image description here

我沒有點擊這個項目,但這一形象已經改變了!這不僅發生在第th項上,它也與其他一些隨機項(53,81,...)相關聯

您對此有何看法?發件人是否可以引用許多元素?

+0

我認爲這個問題可能是i.Source的設置,而不是直接更新綁定的對象的屬性的ImageSource。這是重寫綁定。我相信列表框默認使用虛擬化堆疊面板,所以黃色的太陽正在被回收。您可能還需要listItems類來實現INotifyPropertyChanged。 –

+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; 
} 
+0

還有一件事。而不是處理Image_Tap中的點擊,通常最好使用例如CallMethodAction行爲,將TargetObject設置爲「{Binding}」,將MethodName設置爲由「listItems」視圖模型類實現的公共方法。 – Soonts