簡體   English   中英

WPF:Combobox在綁定ItemSource集合更改后丟失選定的索引

[英]WPF: Combobox losing selected index after bound ItemSource collection changes

我搜索谷歌並在這里尋找答案,我的問題與下面的問題有些相關,但又不同以保證一個新的問題。

收集更改后,組合框丟失選擇

基本上,我有一個綁定到ObservableCollection類的WPF組合框。 如果我需要對其進行一些更改,此類具有延遲收集更改通知的額外功能,例如清除並重新填充它以獲取數據庫的新快照。

我的組合框綁定同時設置了DisplayMemberPath和SelectedValuePath。 SelectedValuePath解析為整數屬性。

問題與引用的問題相同,當我刷新綁定集合中的值時,綁定的ComboBox會丟失其選擇,並變為空白(SelectedIndex = -1)。

我可以確認,在重新填充集合並將項目放回其中之前,CollectionChanged事件不會被觸發。

更令人費解的是,如果我做以下事情:

        using (_collection.DelayNotifications())
        {
            var items = _collection.ToArray();
            _collection.Clear();
            _collection.AddRange(items);
        }

該組合框不會失去其選定的值。

這表明如果集合中的項目被從數據庫中檢索的新項目替換它會中斷 - 如果我沒有使用SelectedValuePath綁定,我可以接受這個,但是因為我是,並且因為整數值是相同的,所以肯定我在做什么應該工作?

我正在使用.NET 3.5 SP1

有人有任何想法嗎?

編輯

從下面的評論和Blam的回答。 我確實接受這就是為什么這樣做的原因。 但它並沒有真正幫助我。

我將Combobox的SelectedValue屬性綁定到我的視圖模型上的Integer屬性。 如果我要綁定SelectedItem,我需要在我的視圖模型上綁定到該對象類型的屬性 - 但它是我實際執行的整數屬性。

目前,我通過強制屬性'SelectedValue'的屬性更改事件來“修復”(讀取次要黑客)問題。 這似乎使Combobox重新檢查其內部列表中的項目,該項目與定義的SelectedValuePath匹配。

WPF組合框必須“知道”它具有一個SelectedValuePath值集,因此我認為它沒有太大的飛躍,可以假設它會調整其項匹配邏輯。 然而,這超出了SO的范圍。

我意識到我可能只是接受這就是WPF的工作原理,但是在WinForms中使用數據綁定的組合框架打了幾年后,我有點希望我不必使用WPF :) - 盡管說WPF組合框比WinForm組合要好得多。

這種說法是錯誤的

如果我沒有使用SelectedValuePath綁定,我可以接受這個,但因為我是

沒有綁定到SelectedValuePath。
您綁定到一組對象。
SelectedValuePath僅用於報告與比較對象的相等性無關。 DisplayMemberPath僅用於報告與比較對象的相等性無關。

您將SelectValuePath與SelectedItem混淆。
ComboBox不使用SelectedValuePath來確定兩個對象是否相等。

從SelectedValuePath的文檔:

獲取或設置用於從SelectedItem獲取SelectedValue的路徑。

在讓您感到困惑的示例中,您將重新加載相同的對象。

我將假設SelectedValuePath是一個名為ID的屬性

如果清除並重新創建ID為6的對象,則它不等於ID為6的已清除對象。

嘗試這個。 創建ID為6的兩個對象(o1和o2)並比較o1.Equals(o2)。

如果您希望ID為6的兩個對象相等,則需要覆蓋GetHashCode和Equals。 如果兩者的ID均為6,則Equals返回true。您可以使用ID作為GetHashCode。

String是一種欺騙你的引用類型。
string s1 =“cat”;
string s2 =“cat”;
當字符串等於被重寫以比較值時,s1.Equals(s2)將返回true。

暫無
暫無

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

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