2010-09-17 4 views
4

permet de dire que j'ai cette classe:ListBox Silverlight avec ObservableCollection <T> et filtre dynamique

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

et un

ObservableCollection<MyData> data = new ObservableCollection<MyData>; 
ListBox.ItemsSource = data; 

Ajout d'éléments aux ObservableCollectionworks comme prévu; cependant, je veux m'assurer que ma listbox n'affiche que les éléments où IsActive est défini sur 'true' - Je ne peux pas utiliser une requête Linq pour définir ItemsSource car ce n'est pas un ObservableCollection, son IEnumerable et aucune mise à jour notifications à la liste.

Répondre

9

Votre réponse est CollectionViewSource. Au lieu de lier à la liste, lier à une instance de CollectionViewSource.

Un exemple légèrement dégénéré suit (je ne sais pas si vous utilisez ViewModels, localisateurs, etc pour résoudre vos données et votre liste.)

Supposons que dans votre balisage vous avez un CollectionViewSource déclaré dans vos ressources en suit:

<phone:PhoneApplicationPage.Resources> 
    <CollectionViewSource x:Key="src"/> 
</phone:PhoneApplicationPage.Resources> 

Ensuite, votre liste ressemble comme liaison:

<ListBox x:Name="MyListBox" ItemsSource="{Binding Source={StaticResource src}}"> 

Enfin, dans le code que vous pouvez épouser votre liste et votre vue collection source:

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

De plus, vous pouvez consulter les articles « Bea Stollnitz sur le sujet:

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

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

+0

Cette compile, mais il ne présente aucun de mes articles (je vérifiais il y a deux IsActive = True et IsActive = False dans la collection) Des idées sur quoi essayer? – Nate

+0

Il semble fonctionner sans la partie View.Filter. Bien que le Predicate semble être OK ... – Nate

-1

La façon plus facile est d'utiliser Visibility en XAML.

Censé votre ListBoxItemTemplate utiliser StackPanel pour stocker vos données, et dans ce cas vous avez 2 TextBlock dans cette StackPanel (1 pour Données1, 1 pour Données2).

donc nous assignons ce de VisibilityStackPanel avec IsActive