簡體   English   中英

從 WPF 列表框中刪除重復項時出現奇怪的結果

[英]Strange result when removing duplicated item from a WPF ListBox

這是我的代碼:

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.." ),我有一個按鈕可以刪除任何項目物品。

如果您 select 第 4 個項目(第二個"CC.." )然后單擊刪除索引為 0 的項目的按鈕(第一個"CC.." ),您會發現ListBox.SelectionChanged事件未被觸發。

但是,如果你在第一個之前插入第二個"CC.." (這意味着第二個"CC.."的索引是 2,第一個"CC.."的索引是 3)那么 select第一個"CC." 並單擊按鈕刪除第二個“CC..”,將觸發ListBox.SelectionChanged事件。

這太奇怪了,有人可以幫助我嗎? 我希望在第二種情況下不會觸發該事件。

ListBox 不會更改 SelectedItems 並且不會觸發 SelectionChanged 如果當前選定的項目和新的項目等於 object.Equals() 方法

該事件觸發是因為當從 ListBox 中刪除一個項目時,它首先遞減索引大於被刪除項目索引的項目的索引,然后檢查“選擇是否更改?”。 此檢查中還考慮了索引。

在您的情況下,所選“CCC”的索引為 3,同一未選擇的“CCC”的索引為 2,當您刪除未選擇的“CCC”時,列表框會在刪除時記住已刪除的“CCC”的索引(2 ),然后遞減所有大於2的item index,選中的"CCC"的index現在也是2,檢查"is the selection changed?"時,選中的item("CCC")的值和它的新索引 (2) 與已刪除項 ("CCC") 的值和已刪除項的索引 (2) 進行比較,比較結果為真,ListBox 觸發 SelectionChanged。

為避免在 ListBoxItem 中使用相同內容包裝項目並將 ListBoxItem 添加到 ListBox.Items:

    itemWithSameContent = strs[2];
    listBox1.Items.Insert(0, new ListBoxItem(){Content = itemWithSameContent});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM