Грубая сила:
- Прикрепить обработчик к каждому событию PropertyChanged для каждого дочернего элемента
- Получите ListCollectionView из вашего CollectionViewSource
- Call Refresh.
EDIT:
Код для 1, 2 будет находиться в вашем коде позади.
Для # 1 вы бы сделали что-то вроде:
private void Source_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach( SomeItem item in e.NewItems)
{
item.PropertyChanged += new PropertyChangedEventHandler(_SomeItem_PropertyChanged);
}
break;
....
**HANDLE OTHER CASES HERE**
....
}
}
Для # 2 в вашем обработчике CollectionChanged вы должны сделать что-то вроде:
private void _SomeItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(theListBox.ItemsSource));
lcv.Refresh();
}
EDIT2:
Однако в этом случае я бы настоятельно предложил, чтобы вы также проверяли ListCollectionView.NeedsRefresh и обновляли только, если это установлено. Нет причин для повторной сортировки, если ваши свойства изменились, что не влияет на сортировку.