具有ObservableCollection 的Silverlight ListBox和动态filter

让我们说我有这个课程:

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

 ObservableCollection data = new ObservableCollection; ListBox.ItemsSource = data; 

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

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

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

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

    

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

  

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

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

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

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

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

更简单的方法是在XAML中使用Visibility

假设您的ListBox ItemTemplate使用StackPanel来保存您的数据,在这种情况下,您在此StackPanel内部有2个TextBlock (Data1为1,Data2为1)。

因此,您应该将此StackPanelVisibilityIsActive绑定