Запретить обновление фильтра ICollectionView на PropertyChanged и удаление из коллекции
У меня возникает странная проблема, когда у меня есть сетка, которая фильтруется, и когда я изменяю значение в сетке, эта строка удаляется, потому что она больше не соответствует критериям фильтра.
Я использую Entity Framework для загрузки локальных данных.
mydbcontext.myobject.LoadAsync();
Затем я привязываю сетку ItemSource к ICollectionView:
ICollectionView myitemslist = CollectionViewSource.GetDefaultView(mydbcontext.myobject.Local);
Затем я выполняю фильтрацию набора данных, используя (в качестве примера)
BusinessProfiles.Filter = f =>
{
var a = f as MyObjectType;
return a.propA == a.propB;
}
Это прекрасно работает, однако если я затем использую сетку для изменения объекта таким образом, чтобы это условие больше не выполнялось, объект исчезает из коллекции.
событие CollectionChanged запускается, но я этого не ожидаю.
Насколько я понимаю, для того, чтобы вести себя таким образом, я должен был бы использовать объект, который реализует ICollectionViewLiveShaping, такой как BindingListCollectionView или ListCollectionView
Когда я делаю изменения, я не хочу обновления фильтра до тех пор, пока я не сохраню и не распространю эти изменения в БД.
1 ответ
Я думаю, что самое простое решение для этого - использовать отдельную коллекцию для привязки вашего взгляда. Отфильтруйте ваши данные с помощью Linq в любой точке, которая подходит вам больше всего. Я думаю, вы обнаружите, что это:
ICollectionView myitemslist = CollectionViewSource.GetDefaultView(mydbcontext.myobject.Local);
Это не просто ICollectionView, это также ListCollectionView или что-то подобное. Это применяет ваш фильтр, поскольку базовый элемент в наблюдаемой коллекции установлен. Поскольку вы, вероятно, хотите, чтобы другие аспекты наблюдаемой коллекции работали, но вы не хотите, чтобы фильтрация включалась на этом этапе, тогда делайте это явно в коде, и вы можете точно контролировать, когда произойдет то, что вы хотите.