Поднять старый пост, но просто создать новый класс коллекции, который наследуется от ListViewCollection и переопределяет OnPropertyChanged (для IBindingList события ListChanged будут содержать изменение свойства в параметре ListChangedEventArgs). И убедитесь, что элементы в коллекции реализуют и используют INotifyPropertyChange при каждом изменении свойства (созданного вами), иначе коллекция не будет привязана к изменениям свойства.
Тогда в этом методе OnPropertyChanged отправителем будет элемент. Удалите элемент, если - и только если - свойство, которое может привести к изменению курорта, изменилось, затем повторно добавьте его (вставьте его в отсортированную позицию, если добавление еще не сделало этого). Перемещение элемента предпочтительнее, если оно доступно, вместо удаления / добавления. Точно так же это должно быть сделано с фильтрацией (проверка предиката фильтра).
IEditableObject не нужен! Если вы хотите отредактировать несколько свойств, затем закончите редактирование (например, редактирование 3 свойств и затем выбор другой строки в WinForm DataGridView), а затем сортировку, это будет правильным способом заставить это работать. Но во многих случаях вы, вероятно, захотите, чтобы коллекция изменялась после изменения каждого свойства без необходимости вручную вызывать BeginEdit / EndEdit. IEditableObject, кстати, присутствует в платформе .NET 2.0 и не является новым для .NET 3.5 (если вы читаете статью доктора).
Примечание. Проблемы могут возникать при использовании BeginEdit () и EndEdit () с несколькими изменениями одного и того же элемента - если только вы не увеличиваете (для true) / уменьшаете (для false) целое число вместо установки логического значения! Не забудьте увеличивать / уменьшать целое число, чтобы действительно знать, когда редактирование закончено.
Хранение постоянно отсортированного списка отнимает много времени и подвержено ошибкам (и это может нарушить контракт на вставку, если вы принудительно сортируете вставки), и его следует использовать только в определенных местах, таких как ComboBoxes. На любой сетке это очень плохая идея, так как изменение строки приведет к тому, что она выйдет из-под текущей позиции пользователя.
Public Class ListView
Inherits ListCollectionView
Protected Overrides Sub OnPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
' Add resorting/filtering logic here.
End Sub
End Class
Лучший пример для коллекции, которая работает аналогично тому, что вам нужно, это Джесси Джонсон ObjectListView, хотя это специфично для .NET 2.0 (IBindingList вместо INotifyCollectionChanged / ObservableCollection / ListCollectionView) и использует очень ограничительную лицензию. Его блог все еще может быть очень ценным в том, как он достиг этого.
Edit:
Забыл добавить, что Sender будет тем элементом, который вам нужен, и e.PropertyName - то, что вам нужно будет использовать, чтобы определить, находится ли он в пределах SortDescription. Если это не так, изменение этого свойства не приведет к необходимости курорта. Если e.PropertyName имеет значение Nothing, то это похоже на обновление, в котором многие свойства могли измениться, и следует выполнить преобразование.
Чтобы определить, нуждается ли он в фильтрации, просто запустите его через FilterPredicate и удалите его при необходимости. Фильтрация намного дешевле, чем сортировка.
Надеюсь, полезно,
TamusJRoyce