我有一個與WCF服務交互的Silverlight應用程序。它定期接收新項目以添加到來自此服務的列表中,並且每個新元素都添加到每個新元素的ObservableCollection(collection.Add())的末尾。當項目添加到Silverlight中的ObservableCollection時,DataGrid不會更新
項目本身在收到後不會更改,並且項目的類繼承INotifyPropertyChanged,但是當我添加新項目(從WCF接收)時,DataGrid不會更新。
我也使用DataGrid綁定的自定義格式化程序,但我不認爲這是一個問題,因爲最初的一組項目顯示正確(當ItemsSource第一次設置時)。
我預料會出現新的元素,因爲我已確認ObservableCollection發出了正確的添加事件。由於ObservableCollection繼承自INotifyCollectionChanged,它不應該更新DataGrid嗎?
到目前爲止,我發現的唯一的解決辦法是:
dataGrid.ItemsSource = null;
dataGrid.ItemsSource = collection;
如何把它更新任何想法?這種方法阻止了用戶界面的時間。
感謝
UPDATE:代碼
的元素在WCF回調事件擴大和提取:
// The ItemWrapper allows the Binding converter to be passed the entire trade object, rather than just each property.
ObservableCollection<ItemWrapper<ExpandedTrade>> pastTrades = new ObservableCollection<ItemWrapper<ExpandedTrade>>();
....
// Extract and expand data - MinimalTrade is the data sent through WCF
var convertedTrades = from MinimalTrade t in e.trades
select new ItemWrapper<ExpandedTrade>(
new ExpandedTrade(t,
usernames.ContainsKey(t.UserToId) ? usernames[t.UserToId] : null, potentialWealth != null ? potentialWealth.CurrentWealth : null)); // Get name, otherwise null.
// Data now expanded (to show full information like usernames
// pastTrades is an observableCollection
foreach (var trade in convertedTrades)
{
pastTrades.Add(trade);
}
OnNewMyTradeHistory(pastTrades);
的OnNewMyTradeHistory事件再做到這一點:
if (tradeHistory.ItemsSource == null) tradeHistory.ItemsSource = trades;
這隻套ItemsSource曾經(到ObservableCollection)和添加事件觸發,但沒有發生在用戶界面上。
WCF回調可能發生在另一個線程中。
您是否綁定到依賴項屬性? –
這應該工作。你將不得不向我們展示更多的代碼。你如何添加項目到你的收藏?你能提供一個你可以在這裏完整提供的問題的非常精簡的版本嗎? – ColinE
您是否正在更新後臺線程上的數據網格源?我有問題讓PropertyChanged事件在使用一些後臺線程時正確觸發 – Rachel