Возможно, немного поздно, но это может помочь другим пользователям, так что я все равно выложу ...
Обновление CollectionView.Filter на основе события PropertyChanged не поддерживается платформой.
Есть несколько решений вокруг этого.
1) Реализация интерфейса IEditableObject на объектах внутри вашей коллекции и вызов BeginEdit и EndEdit при изменении свойства, на котором основан фильтр.
Вы можете прочитать больше об этом в превосходном блоге Dr.WPF здесь: Редактируемые коллекции Dr.WPF
2) Создание следующего класса и использование функции RefreshFilter для измененного объекта.
public class FilteredObservableCollection<T> : ObservableCollection<T>
{
public void RefreshFilter(T changedobject)
{
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, changedobject, changedobject));
}
}
Пример:
public class TestClass : INotifyPropertyChanged
{
private string _TestProp;
public string TestProp
{
get{ return _TestProp; }
set
{
_TestProp = value;
RaisePropertyChanged("TestProp");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
FilteredObservableCollection<TestClass> TestCollection = new FilteredObservableCollection<TestClass>();
void TestClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "TestProp":
TestCollection.RefreshFilter(sender as TestClass);
break;
}
}
Подпишитесь на событие PropertyChanged объекта TestClass при его создании, но не забудьте отсоединить обработчик событий при удалении объекта, иначе это может привести к утечкам памяти
OR
Вставьте TestCollection в TestClass и используйте функцию RefreshFilter внутри установщика TestProp.
В любом случае, магия здесь работает с NotifyCollectionChangedAction.Replace, которая полностью обновляет элемент.