Что вам нужно сделать, это создать постоянный, привязываемый объект коллекции где-то в вашем представлении и назначить его на ItemsSource один раз.По мере поступления новых элементов просто добавляйте их в коллекцию.
Вы можете либо выбрать существующий тип коллекции, который поддерживает уведомления при изменении коллекции, либо внедрить его самостоятельно.В Silverlight я думаю, что ваша лучшая (только?) Ставка - System.Collections.ObjectModel.ObservableCollection
.Другой вариант - реализовать System.Collections.Specialized.INotifyCollectionChanged
в пользовательском классе, который наследует от другого типа Collection.
Что касается сортировки, если ваши поступающие данные всегда будут позже существующих, тогда вы можете просто отсортироватьновые элементы перед добавлением их в коллекцию (вы можете вставить их в начало коллекции, если хотите отобразить их с самыми новыми в верхней части).
Однако, если для всей коллекции требуетсячтобы сортироваться каждый раз, когда добавляются новые записи, вам нужно будет внедрить System.IComparable
в свой класс предметов.В этом случае я бы порекомендовал следующий подход:
Создать новый класс коллекции на основе System.Collection.Generic.List
(он содержит собственный метод Sort ()).
В этом случае реализовать INotifyCollectionChanged
Класс и поднять его CollectionChanged
событие с действием NotifyCollectionChangedAction.Reset
после добавления и сортировки ваших записей.
Реализация IComparable
в вашем классе элементов, чтобы получить элементы, отсортированные в соответствии с вашими правилами.
Обновление с реализацией INotifyCollectionChanged
Большая часть предложения довольно проста, но реализация INotifyCollectionChanged немного сложна, поэтому я включаю ее здесь:
<NonSerialized()> _
Private m_ListChangedEvent As NotifyCollectionChangedEventHandler
''' <summary>
''' This event is raised whenever the list is changed and implements the IBindingList ListChanged event
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Public Custom Event ListChanged As NotifyCollectionChangedEventHandler Implements INotifyCollectionChanged.CollectionChanged
<MethodImpl(MethodImplOptions.Synchronized)> _
AddHandler(ByVal value As NotifyCollectionChangedEventHandler)
m_ListChangedEvent = DirectCast([Delegate].Combine(m_ListChangedEvent, value), NotifyCollectionChangedEventHandler)
End AddHandler
<MethodImpl(MethodImplOptions.Synchronized)> _
RemoveHandler(ByVal value As NotifyCollectionChangedEventHandler)
m_ListChangedEvent = DirectCast([Delegate].Remove(m_ListChangedEvent, value), NotifyCollectionChangedEventHandler)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs)
If m_ListChangedEvent IsNot Nothing Then
m_ListChangedEvent.Invoke(sender, e)
End If
End RaiseEvent
End Event
Чтобы поднять это событие, чтобы потребители знали об изменениях в списке:
Call RaiseListChangedEvent(New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset))