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