c# – 带有ObservableCollection和动态过滤器的Silverlight ListBox

让我们说我有这个课程:

public class MyData
{
    public bool IsActive{get;set;}
    public String Data1 {get;set;}
    public String Data2 {get;set;}
}

ObservableCollection<MyData> data = new ObservableCollection<MyData>;
ListBox.ItemsSource = data;

按预期将项添加到ObservableCollectionworks;但是,我想确保我的列表框只显示IsActive设置为’true’的项目 – 我不能使用Linq查询来设置ItemsSource,因为它不是ObservableCollection,它的IEnumerable并没有做任何更新通知列表框.

解决方法:

你的答案是CollectionViewSource.而不是绑定到列表,绑定到CollectionViewSource的实例.

下面是一个稍微退化的示例(我不确定您是否使用ViewModels,Locators等来解析您的数据和列表.)

假设在您的标记中,您在资源中声明了一个CollectionViewSource,如下所示:

<phone:PhoneApplicationPage.Resources>
    <CollectionViewSource x:Key="src"/>
</phone:PhoneApplicationPage.Resources>

然后你的列表绑定看起来像:

<ListBox x:Name="MyListBox" ItemsSource="{Binding Source={StaticResource src}}">

最后,在代码中,您可以将列表和集合视图源结合起来:

        var collectionView = this.Resources["src"] as CollectionViewSource;
        // Check for null, etc.
        collectionView.Source = observableCollectionThatIAmBindingTo;
        collectionView.View.Filter=new Predicate<Object>(o => ((ItemType)o).IsActive );

此外,您可以查看Bea Stollnitz关于该主题的文章:

http://bea.stollnitz.com/blog/?p=31

http://bea.stollnitz.com/blog/?p=392

相关文章

如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的...
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,...
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如...
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不...
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:...
我需要根据Silverlight中的某些配置值设置给定控件的Style.我...