Silverlight 4 CollectionViewSource列表框基于DataType的过滤器

nquis 发布于 2019-03-09 c# 最后更新 2019-03-09 14:36 3 浏览

我有一个ListBox,我正在加载三种类型的对象,它们都从同一父类型继承。我想使用CollectionViewSource根据其类型过滤出ListBox中的对象,但是我在编写过滤器时遇到了问题。 我的XAML如下:

<UserControl.Resources>
    <CollectionViewSource x:Key="eventsViewSource" 
                          Source="{Binding lifeCycleEvents}" >
        <CollectionViewSource.SortDescriptions>
            <compMod:SortDescription PropertyName="Date" Direction="Ascending"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</UserControl.Resources>
<ListBox Name="lstEventHistory"  ItemsSource="{Binding Source={StaticResource eventsViewSource}}">
...
</ListBox>
在代码隐藏中,我加载了一个可观察的异步方法调用返回的对象集合:
private ObservableCollection<LifeCycleEvent> lifeCycleEvents;
...
                lifeCycleEvents= e.Result; 
                CollectionViewSource eventsViewSource = this.Resources["eventsViewSource"] as CollectionViewSource;
                eventsViewSource.Source = lifeCycleEvents;
现在我想编写一个过滤器,该过滤器仅基于用户将在UI中单击的复选框显示某种类型的对象。 以下是编写一个过滤器失败的尝试:
eventsViewSource.Filter = new Predicate<object>(rmaFilter);
public bool rmaFilter(object item)
     {
        if(item.GetType() == typeof(RmaEvent))
            return true;
        else 
            return false;
     }
这给出了以下错误:“事件System.Windows.Data.CollectionViewSrouce.Filter只能出现在+ =或 - =”的左侧。 我一直无法找到任何我需要的教程。那些依赖于Silverlight中不存在的默认视图。我看到的一个这样的教程可以找到here 任何提示都表示赞赏!
已邀请:

dut

赞同来自:

CollectionViewCollectionViewSource的Filter属性是一个事件,包含FilterEventHandler类型的集合,而不是Predicate。 为CollectionView中的每个项调用每个事件处理程序,以确定是否应显示它。 此外,从Filter属性添加或删除事件处理程序将导致调用事件处理程序并更新集合。 因此,为Filter事件处理程序连接的正确代码是:

eventsViewSource.Filter += new FilterEventHandler(rmaFilter);
并删除它:
eventsViewSource.Filter -= new FilterEventHandler(rmaFilter);
和新的处理程序:
public void rmaFilter(object sender, FilterEventArgs args)
 {
    args.Accepted = args.Item is RmaType;
 }

sit_et

赞同来自:

根据MSDN文档,Filter是CollectionViewSource类型中的事件。 所以?正确的语法是:

eventsViewSource.Filter += new Predicate<object>(rmaFilter);
在教程中,您已经在上面链接,作者使用了CollectionViewSource类型的static method,它返回一个CollectionView对象。此CollectionView对象具有Filter属性(不是事件!),您可以使用=语法为其分配Filter委托