2010-09-17 19 views
4

Silverlight的ListBox中可以說我有這個類:用的ObservableCollection <T>和動態濾波

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並且不會執行任何更新通知到列表框。

回答

9

您的回答是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); 

此外,您可能想在退房衣Stollnitz」的主題文章:

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

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

+0

這編譯,但它不顯示我的任何物品(我驗證有兩個IsActive = True和IsActive =假集合中)想要嘗試什麼? – Nate 2010-09-17 04:43:53

+0

它看起來沒有View.Filter部分工作。儘管Predicate似乎沒問題...... – Nate 2010-09-17 04:45:33

-1

更簡單的方法是在XAML使用Visibility

認爲你ListBoxItemTemplate使用StackPanel來保存數據,在這種情況下你有2 TextBlockStackPanel內(1數據1,1數據2)。

所以,你應該綁定這個StackPanelVisibilityIsActive