CollectionView.Filter的Predicate <object>可以在不同的类中吗?</object>

时间:2011-05-02 21:50:47

标签: c# wpf collectionview

我有一个TagTypeController类,它为WPF UserControl的控制器提供集合视图,该控件包含对集合视图的私有引用。

_ttController = new TagTypeController(_isProd);
CollectionView tagTypeList = _ttController.getTagTypes();

在TagTypeController中,创建CollectionView时,我正在设置过滤器委托

if (_tagTypeList == null)
    _tagTypeList = new CollectionView(CollectionViewSource.GetDefaultView(_tagTypeTable));
    _tagTypeList.Filter = new Predicate<object>(filterTagTypes);

我想在TagTypeController类中找到该集合视图的所有过滤等逻辑。问题是,当文本在UserControl的TextBox中发生变化时,我通过委托给UserControl的控制器来响应该事件。当我要求tagTypeList刷新时,它不会调用filterTagTypes方法。是否不可能将过滤器委托放在另一个类中?

感谢。

编辑:添加请求的代码

//parse the string to get just the portion after the last comma and space
Int32 _lastComma = _tempText.LastIndexOf(",");
_ttController.searchText = _tempText.Substring(_lastComma + 1).Trim();

tagTypeList.Refresh();

1 个答案:

答案 0 :(得分:1)

我认为问题可能是您使用过滤器谓词而不是事件。如果你看一下它所说的CollectionView文档:

  

如果您的视图对象来自   您应用CollectionViewSource对象   通过设置事件来过滤逻辑   Filter事件的处理程序。

因此,不要设置要使用事件处理程序的属性,因此代码看起来像

_tagTypeList.Filter += FilterTagTypesHandler;

其中FilterTagTypesHandler定义为

private void FilterTagTypesHandler(object sender, FilterEventArgs e){
  //do filtering
}

另一种可能性是您正在创建新的CollectionView,而不是投射GetDefaultView()的结果。当你这样做时,你可能正在失去与控件的连接。如果您查看CollectionViewSource's documentation推荐的使用方式是

myCollectionView = (CollectionView)
    CollectionViewSource.GetDefaultView(rootElem.DataContext);