C# Silverlight列表框,带可观察收集<;T>;动态滤波器

C# Silverlight列表框,带可观察收集<;T>;动态滤波器,c#,wpf,silverlight,data-binding,windows-phone-7,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;

假设我有一门课:

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;
ObservableCollection数据=新的ObservableCollection;
ListBox.ItemsSource=数据;

按预期向ObservableCollectionworks添加项目;但是,我想确保我的列表框只显示
IsActive
设置为“true”的项目——我不能使用Linq查询来设置ItemsSource,因为这样它就不是一个ObservableCollection,它是IEnumerable,并且不会向列表框发送任何更新通知。

您的答案是CollectionViewSource。与其绑定到列表,不如绑定到CollectionViewSource的实例

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

假设在标记中,资源中声明了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 );
var collectionView=this.Resources[“src”]作为CollectionViewSource;
//检查空值等。
collectionView.Source=我绑定到的可观察集合;
collectionView.View.Filter=新谓词(o=>((ItemType)o.IsActive);
此外,您可能想在以下网址查看Bea Stollnitz关于该主题的文章:


更简单的方法是在XAML中使用
可见性

假设您的
ListBox
ItemTemplate
使用
StackPanel
来保存数据,在这种情况下,在
StackPanel
中有2个
TextBlock
(1代表数据1,1代表数据2)


因此,您应该将此
StackPanel
Visibility
IsActive

绑定,这将编译,但它不会显示我的任何项目(我验证了集合中同时存在IsActive=True和IsActive=False),您对尝试什么有什么想法吗?它似乎在没有视图的情况下工作。筛选部分。尽管谓词似乎是正确的。。。