ICollectionView.Refresh не фильтрует коллекцию - PullRequest
2 голосов
/ 13 ноября 2011

У меня есть 3 каскада ICollectionView в моей модели вида, где один зависит от другого. Первый не привязан к элементу управления в представлении, а скорее используется в качестве ключевого фильтра для двух следующих, которые отображаются пользователю как master-detail.

Моя проблема в том, что я прикрепил предикат фильтра к основному представлению коллекции, но когда я вызываю Refresh из него, он вообще не попадает в фильтр. Я даже пытался выдать исключение из предиката фильтра, поэтому в случае, если отладчик не сможет получить этот код, я все равно буду видеть, что он прибыл, но исключение не было выдано.

В чем может быть причина того, что я называю Refresh, и это не приводит меня к предикату фильтра - то есть он не воссоздает представление?

1 Ответ

3 голосов
/ 13 ноября 2011

Я нашел обходной путь, который работает, но он мне не нравится.

Что я делаю, так это снова сбрасываю свойство Filter, которое выполняет свою работу.
Я бродил вокругНемного в Reflector пытается найти то, что мне не хватает, но не добился большого успеха, проясняя причину.

private ICollectionView _Products;
public ICollectionView Products
{
  get
  {
    if (_Products == null)
    {
      _Products = 
         CollectionViewSource.GetDefaultView(ProductsLibrary.SupportedProducts);
      _Products.Filter = product => FilterProduct((Product)product);
    }

    return _Products;
  }
}
private bool FilterProduct(Product product)
{
  /**********************/
}

////////////////////

private void Search()
{
  //Products.Refresh();
  Products.Filter = product => FilterProduct((Product)product);
  Categories.Refresh();
  CategoryProducts.Refresh();
}

ОБНОВЛЕНИЕ

Я нашел гораздо более простое решение.

Я изменил первый ICollectionView на простой IEnumerable<Product>, возвращая запрос Linq.

Не выяснив, почему обновление не сработало, однако в других представлениях коллекции (которые связаны спользовательский интерфейс) обновление работает, и поэтому фильтр linq IEnumerable<Product> делает свою работу.

...