c# - 带有 ObservableCollection<T> 和动态过滤器的 Silverlight ListBox

标签 c# wpf silverlight data-binding windows-phone-7

假设我有这个类:

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。不要绑定(bind)到列表,而是绑定(bind)到 CollectionViewSource 的一个实例。

下面是一个稍微退化的示例(我不确定您是否使用 ViewModel、定位器等来解析您的数据和列表。)

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

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

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

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

最后,在代码中你可以结合你的列表和你的 Collection View 源:

        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

关于c# - 带有 ObservableCollection<T> 和动态过滤器的 Silverlight ListBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3732145/

相关文章:

c# - 如何使用 .NET 压缩目录?

c# - WPF:命名空间中不存在该名称

c# - 从 DataGrid 的 DataGridTemplateColumn 获取复选框值

Silverlight XAP 在同一台计算机的 2 个 session 之间共享

c# - 企业库验证 - 允许空值但验证其他属性?

c# - 序列化从 WebService 到对象的 XML 响应 (C#)

c# - 一对多下拉列表建议

wpf - 在 winform 或 wpf 中拖放

silverlight - 当MVVM内置的riaservices功能中断时,为什么要使用MVVM

silverlight - Silverlight错误记录