Objet collectionviewsource, comment filtrer les données?

Je suis de la liaison d'une zone de liste déroulante à des Entités, mais je veux que les données filtrées.

Jusqu'à maintenant, j'ai essayé de deux façons:

  • "simple": Appliquer le filtre directement à la ObjectSet à travers
    LINQ to entities
  • paramètre un filtrage du gestionnaire d'événement tel que décrit sur
    msdn

Je suis satisfait par la première approche, au-dessus de tout parce que la requête générée à la base de données contient une clause where, afin de ne pas tous l'ensemble des données doivent être récupérées à partir de la télécommande db....

Cependant, le n ° 2 approche est de loin la plus flexible, si lors de l'exécution j'aimerais modifier le filtrage appliqué... j'ai suivi l'exemple sur msdn, mais j'obtiens une exception, pourquoi?

Donc, mes questions sont les suivantes:

1. L'approche la mieux

2. Pourquoi je reçois de l'exception?

Voici mon code:

 private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        //Do not load your data at design time.
        if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
        {
            //Load your data here and assign the result to the CollectionViewSource.
            System.Windows.Data.CollectionViewSource myCollectionViewSource =
                (System.Windows.Data.CollectionViewSource)
                this.Resources["tSCHEDEViewSource"];

            //If I use this I get the data filtered on startup, but is it the right mode?
            //myCollectionViewSource.Source = _context.TSCHEDE.Where(s => s.KLINEA == kLinea && s.FCANC == "T").OrderBy(s => s.DSCHEDA).OrderByDescending(s => s.DSTORICO);

            //Instead If I apply my custom filtering logic
            myCollectionViewSource.Filter += new FilterEventHandler(filterSource);

            myCollectionViewSource.Source = _context.TSCHEDE; //... Here i get an exception: 
            //'System.Windows.Data.BindingListCollectionView' view does not support filtering. ???
        }
    }


    private void filterSource(object sender, FilterEventArgs e)
    {
        TSCHEDE scheda = e.Item as TSCHEDE;
        if (scheda != null)
        {
            if (scheda.KLINEA == 990)
            {
                e.Accepted = true;
            }
            else
            {
                e.Accepted = false;
            }
        }
    }

MODIFIER: j'ai essayé de mettre en œuvre le Filtre de propriété sur la Vue plutôt que de fixer le Gestionnaire d'événements:

myCollectionView = (BindingListCollectionView)myCollectionViewSource.View;
myCollectionView.Filter = new Predicate<object>(Contains);

public bool Contains(object de)
    {
        TSCHEDE scheda = de as TSCHEDE;
        return (scheda.KLINEA == 990);
    }

Et maintenant, je reçois le pas si utile exception:

Système.NotSupportedException: méthode Spécifiée n'est pas prise en charge.
au Système.De Windows.Les données.CollectionView.set_Filter(Prédicat`1 valeur)

MODIFIER

Code XAML:

<UserControl.Resources>
    <CollectionViewSource x:Key="tSCHEDEViewSource" d:DesignSource="{d:DesignInstance my:TSCHEDE, CreateList=True}"  >
    </CollectionViewSource>
    <DataTemplate x:Key="SchedaTemplate">
        <StackPanel Orientation="Horizontal" >
            <TextBlock Text="{Binding Path=KSCHEDA}" Width="60"></TextBlock>
            <TextBlock Text="{Binding Path=DArticolo}" Width="200"></TextBlock>
            <TextBlock Text=" - " Width="40"></TextBlock>
            <TextBlock Text="{Binding Path=DSTORICO}" Width="150"></TextBlock>
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>
<Grid Background="PapayaWhip" DataContext="{StaticResource tSCHEDEViewSource}" DataContextChanged="StartHere" Name="rootGrid">
    <ComboBox ItemTemplate="{StaticResource SchedaTemplate}" Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="23,129,0,0" Name="tSCHEDEComboBox1" SelectedValuePath="KSCHEDA" VerticalAlignment="Top" Width="393">
        <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </ComboBox.ItemsPanel>
    </ComboBox>
</Grid>

Maintenant, je pense que le problème est dans le code XAML de Liaison, pas de code derrière...

OriginalL'auteur spiderman | 2013-01-24