假设我有这个类:
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 关于该主题的文章:
关于c# - 带有 ObservableCollection<T> 和动态过滤器的 Silverlight ListBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3732145/