2010-04-21 46 views
0

我綁定了一個ListView屬性,基本上包裝值集合(ICollection)在通用字典上。WPF綁定到IDictionary <int,MyType>。值不響應屬性更改?

當字典中的值發生變化時,我調用OnNotifyPropertyChanged(property)。我沒有看到屏幕上的更新,沒有綁定錯誤。

當我改變屬性getter返回Linq擴展dictionary.Values.ToList(),而不改變屬性的簽名(ICollection)它沒有問題。

爲什麼Values集合綁定並正確通知而沒有投影到IList <>?

回答

2

調用OnNotifyPropertyChanged()在這種情況下不完全正確,因爲集合仍然相同,但集合中的項目已更改。我不知道WPF綁定代碼是如何工作的,但它可能會快速檢查它是否綁定到的引用已更改,如果沒有,它將不會更新UI。

ToList()的工作原因是因爲每次調用該函數時都會返回一個新的List<T>實例,因此當觸發OnNotifyPropertyChanged()時,WPF會選擇該更改並更新其所有綁定。

我不知道這是否可行,但理想的解決方案是使用集合實現INotifyCollectionChanged的綁定。這將觸發WPF監視的事件,以便可以根據需要從UI添加,刪除項目等。

+0

有趣的,雖然我認爲這就是所謂的PropertyChanged完成。在大多數情況下(並且在大多數例子中),這被放置在設置器中,並且僅在值/參考改變時才被調用。這實際上正是我認爲我的方法可行的原因 - 我認爲PropertyChanged調用導致了更新,而不是值/參考的更改。 – 2010-04-21 19:12:34

+0

有一些實現INotifyCollectionChanged的字典的例子。嘗試搜索ObservableDicitonary。 – 2010-04-21 19:23:15

+0

@Phil @Andy是正確的,因爲WPF綁定系統將引用作爲優化來檢查。如果引用不改變,它不會更新綁定。這就是INotifyCollectionChanged接口存在的原因。 – 2010-04-21 19:25:06