1

我有一个 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 中不存在的默认视图。我看过的一个这样的教程可以在这里找到

任何提示表示赞赏!

4

2 回答 2

1

CollectionViewand的 Filter 属性CollectionViewSource是一个事件,包含一个类型的集合FilterEventHandler,而不是Predicate。为 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;
 }
于 2013-04-12T14:27:29.973 回答
0

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

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

在教程中,你已经链接了上面,作者使用了 CollectionViewSource 类型的静态方法,它返回一个 CollectionView 对象。此 CollectionView 对象具有 Filter 属性(还不是事件!),您可以使用=语法将 Filter 委托分配给它

于 2013-04-11T19:29:29.643 回答