這是我的代碼:
public SelectorDemo()
{
InitializeComponent();
List<string> strs = new List<string>()
{
"AAAAAAAAAAAAAAAAAAAAA",
"BBBBBBBBBBBBBBBBBBBBBBBB",
"CCCCCCCCCCCCCCCCCCCCCCCC",
"DDDDDDDDDDDDDDDDDDDDDDDD",
};
for (int i = 0; i < strs.Count; i )
{
this.listBox1.Items.Add(strs[i]);
}
_ccc = strs[2];
listBox1.Items.Insert(0, _ccc);
}
private void btn_Click(object sender, RoutedEventArgs e)
{
listBox1.Items.Remove(0);
}
private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
您可以看到我的ListBox現在有 5 個專案 ( "CC..","AA..","BB..","CC..","DD.."),并且我有一個可以洗掉任何專案的按鈕。
如果您選擇第 4 項(第二項"CC..")然后單擊洗掉索引為 0 的項(第一項)的按鈕"CC..",您會發現該ListBox.SelectionChanged事件沒有觸發。
但是,如果您"CC.."在第一個前面插入第二個(這意味著第二個"CC.."的索引是 2,第一個"CC.."的索引是 3)然后選擇第一個"CC."并單擊按鈕以洗掉第二個“CC..”,事件ListBox.SelectionChanged被觸發。
太奇怪了,誰能幫幫我?我希望在第二種情況下不會觸發該事件。
uj5u.com熱心網友回復:
如果當前選定的專案和新專案與 object.Equals() 方法相等,則 ListBox 不會更改 SelectedItems 并且不會觸發 SelectionChanged
觸發該事件是因為當從 ListBox 中洗掉專案時,它首先減少索引大于被洗掉專案索引的專案的索引,然后檢查“選擇是否更改?”。在此檢查中還考慮了索引。
在您的情況下,所選“CCC”的索引為 3,而未選擇的“CCC”的索引為 2,當您洗掉未選擇的“CCC”時,ListBox 在洗掉時記住已洗掉的“CCC”的索引(2 ),然后遞減所有大于 2 的項索引,選中的“CCC”的索引現在也為 2,并且在檢查“選擇是否更改?”時,選中的項的值(“CCC”)和將其新索引 (2) 與已洗掉專案的值 ("CCC" ) 和已洗掉專案的索引 (2) 進行比較,比較結果為真,并且 ListBox 觸發 SelectionChanged。
為避免在 ListBoxItem 中包含相同內容的包裝專案并將 ListBoxItem 添加到 ListBox.Items:
itemWithSameContent = strs[2];
listBox1.Items.Insert(0, new ListBoxItem(){Content = itemWithSameContent});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/466560.html
上一篇:如何將具有StringFormat的資料網格列系結為具有CultureInfo“en-In”的N2?
下一篇:從非托管緩沖區創建影像
