2009-10-19 78 views
1

我有一個silverlight 3.0項目,其中有一個列表框,它是一個列表框,用於將數據綁定到項目列表。我想要做的是將列表框中顯示的項目數量限制爲< = 10.我原本通過在綁定數據和數據綁定時對綁定到列表的數據進行限制,將其限制爲10個項目。結果。 ()方法的問題是原始數據源可能會改變,並且自.Take()返回原始數據的引用(或複製不確定)我有時看不到數據中的更改反映在我的用戶界面。自定義列表框:限制最大項目數

我想找出一個更好的方式來處理這個,而不是.Take()方法。如果你有多個UI元素綁定到相同的數據,你似乎不應該使用LINQ函數'過濾'你的數據。我唯一想到如何更好地做到這一點的方法是製作一個自定義容器,以限制計數,但似乎可能是製作自定義堆棧面板或同等設備的一大堆工作。

回答

0

Take(10)不會複製,它只是將另一個步驟附加到LINQ查詢。但是,所有執行都會延遲到某個人拉出查詢的項目。

如果您要靜態設置項目,通過運行一次查詢確實會創建一個副本。但是由於您將構建的查詢設置爲列表框的ItemsSource屬性,因此它可以隨時運行並更新它,因此它是正確的方法。

你有時看不到UI中反映的數據發生變化的真正原因是,列表框無法確定查詢返回的數據爲什麼發生了變化,並且它肯定不希望保持不變試圖重新獲取數據並可能更新自己。你需要讓它知道。

你怎麼能讓它知道? ItemsSource的文檔說「」應該將ItemsSource設置爲實現INotifyCollectionChanged接口的對象,以便集合中的更改將被反映(...)「。顯然,.Net本身的缺省做法在你的情況下不起作用。

所以有一些例子說明如何自己實現在this SO answer。如果即使頂級源數據收集(您正在進行LINQ查詢時)也不支持這些通知(您只需轉發這些通知),則可能需要從其他代碼手動更新列表框,以更改基礎數據。