2

我的视图模型中有 3 个 cascading ICollectionView,其中一个依赖于另一个。第一个不绑定到视图上的控件,而是用作两个即将出现的作为主细节显示给用户的键过滤器。

我的问题是,我将过滤谓词附加到主集合视图,但是当我Refresh从它调用时,它根本不会进入过滤器。我什至尝试从过滤谓词中抛出一个异常,所以如果调试器无法访问该代码,我仍然会看到它到达,但没有抛出异常。

我调用 Refresh 的原因是什么,但它没有带我进入过滤谓词 - 这意味着它没有重新创建视图?

4

1 回答 1

3

我找到了一个可行的解决方法,但我不喜欢它。

我正在做的是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 查询。

在不知道为什么刷新不起作用的情况下,但是在其他集合视图(绑定到 UI)上,刷新确实起作用,因此,linq 过滤器IEnumerable<Product>完成了这项工作。

于 2011-11-13T07:46:58.610 回答