让我说我有这个课程:
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并且不对列表框进行任何更新通知。
答案 0 :(得分:9)
你的答案是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关于该主题的文章:
答案 1 :(得分:-1)
更简单的方法是在XAML中使用Visibility
。
假设您的ListBox
ItemTemplate
使用StackPanel
来保存您的数据,在这种情况下,您TextBlock
内有2 StackPanel
(Data1为1, 1 for Data2)。
所以你应该用{strong> IsActive
绑定这个StackPanel
&#39; Visibility