У меня есть приложение Silverlight, которое взаимодействует со службой WCF.Он периодически получает новые элементы для добавления в список из этого сервиса, и каждый новый элемент добавляется в конец ObservableCollection (collection.Add () для каждого нового элемента).
Сами элементы неизменить, как только они будут получены, и класс элементов наследует INotifyPropertyChanged, однако, когда я добавляю новые элементы (полученные из WCF), DataGrid не обновляется.
Я также использую пользовательский форматировщик для привязки DataGrid, но яне думайте, что это проблема, поскольку начальный набор элементов отображается правильно (когда впервые установлен ItemsSource).
Я ожидал появления новых элементов, так как я подтвердил, что ObservableCollection испускаетправильное событие добавления.Так как ObservableCollection наследует от INotifyCollectionChanged, разве он не должен обновлять DataGrid?
Единственное решение, которое я нашел до сих пор, это:
dataGrid.ItemsSource = null;
dataGrid.ItemsSource = collection;
Есть какие-нибудь идеи о том, как его обновить?Этот метод блокирует пользовательский интерфейс на заметное количество времени.
Спасибо
ОБНОВЛЕНИЕ: Код
Элементы раскрываются и извлекаются в событии обратного вызова 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), и события add запускаются, но на стороне пользовательского интерфейса ничего не происходит.
Обратные вызовы WCF могут происходить в другом потоке.