C# Silverlight 4 CollectionViewSource列表框过滤器基于数据类型

C# Silverlight 4 CollectionViewSource列表框过滤器基于数据类型,c#,silverlight,listbox,collectionviewsource,C#,Silverlight,Listbox,Collectionviewsource,我有一个列表框,我正在加载三种类型的对象,它们都继承自同一父类型。我想使用CollectionViewSource根据对象的类型过滤掉列表框中的对象,但我在编写过滤器时遇到问题 我的XAML如下所示: <UserControl.Resources> <CollectionViewSource x:Key="eventsViewSource" Source="{Binding lifeCycleEvents}" >

我有一个列表框,我正在加载三种类型的对象,它们都继承自同一父类型。我想使用CollectionViewSource根据对象的类型过滤掉列表框中的对象,但我在编写过滤器时遇到问题

我的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;
私有可观察收集生命周期事件;
...
生命周期事件=e.结果;
CollectionViewSource eventsViewSource=this.Resources[“eventsViewSource”]作为CollectionViewSource;
eventsViewSource.Source=生命周期事件;
现在,我想编写一个过滤器,它将根据用户在UI中单击的复选框仅显示特定类型的对象

以下是写入一个筛选器的失败尝试:

eventsViewSource.Filter = new Predicate<object>(rmaFilter);

public bool rmaFilter(object item)
     {
        if(item.GetType() == typeof(RmaEvent))
            return true;
        else 
            return false;
     }
eventsViewSource.Filter=新谓词(rmaFilter);
公共布尔筛选器(对象项)
{
if(item.GetType()==typeof(RmaEvent))
返回true;
其他的
返回false;
}
这会产生以下错误:“event System.Windows.Data.CollectionViewSrouce.Filter只能出现在+=或-=”的左侧

我还没有找到任何能完全满足我需要的教程。这些都依赖于Silverlight中不存在的默认视图。我看过的一个这样的教程可以找到

任何提示都将不胜感激

根据文档,过滤器是CollectionViewSource类型中的事件。 所以正确的语法是:

eventsViewSource.Filter += new Predicate<object>(rmaFilter);
eventsViewSource.Filter+=新谓词(rmaFilter);
在本教程中,您看到了上面的链接,作者使用了CollectionViewSource类型,该类型返回CollectionView对象。此CollectionView对象具有Filter属性(尚未设置事件!),您可以使用
=
语法将Filter委托指定给它。根据文档,Filter是CollectionViewSource类型中的事件。 所以正确的语法是:

eventsViewSource.Filter += new Predicate<object>(rmaFilter);
eventsViewSource.Filter+=新谓词(rmaFilter);

在本教程中,您看到了上面的链接,作者使用了CollectionViewSource类型,该类型返回CollectionView对象。此CollectionView对象具有Filter属性(还没有事件!),您可以使用
=
语法将Filter委托分配给它
CollectionView
CollectionViewSource
的Filter属性是一个事件,包含类型为
FilterEventHandler
,而不是
谓词的集合。
为CollectionView中的每个项目调用每个事件处理程序,以确定是否应显示该项目

此外,从Filter属性中添加或删除事件处理程序将导致调用事件处理程序并更新集合

因此,连接过滤器事件处理程序的正确代码是:

eventsViewSource.Filter += new FilterEventHandler(rmaFilter);
并将其删除:

eventsViewSource.Filter -= new FilterEventHandler(rmaFilter);
新的处理程序:

public void rmaFilter(object sender, FilterEventArgs args)
 {
    args.Accepted = args.Item is RmaType;
 }

CollectionView
CollectionViewSource
的筛选器属性是一个事件,包含类型为
FilterEventHandler
的集合,而不是
谓词
。 为CollectionView中的每个项目调用每个事件处理程序,以确定是否应显示该项目

此外,从Filter属性中添加或删除事件处理程序将导致调用事件处理程序并更新集合

因此,连接过滤器事件处理程序的正确代码是:

eventsViewSource.Filter += new FilterEventHandler(rmaFilter);
并将其删除:

eventsViewSource.Filter -= new FilterEventHandler(rmaFilter);
新的处理程序:

public void rmaFilter(object sender, FilterEventArgs args)
 {
    args.Accepted = args.Item is RmaType;
 }