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
Vous devez vous connecter pour publier un commentaire.
Cochez cette
1) CollectionView De Filtrage
De filtrage nécessite un délégué (Prédicat) à partir de laquelle le filtre va se produire. Prend le Prédicat dans l'élément d'une base sur la valeur vrai ou faux il retourne, il permet de sélectionner ou de désélectionner un élément.
2) En filtrant les données de façon dynamique
les programmeurs né pour faire des choses compliquées 🙂
Ce fut, en fait, la réponse.
OriginalL'auteur Master Stroke
Al dernier j'ai trouvé une solution, comme publié également dans cette question
déclarer explicitement le type de la Collection:
CollectionViewType="ListCollectionView"
Donc en XAML ajouté le type de Collection:
Et dans le code maintenant le Gestionnaire d'Événement de travaux:
Le seul regret est que je ne comprenais pas pourquoi, quelque chose de si simple en apparence, j'ai du forcer "à la main" dans le code XAML ???
Pour moi, cela semble un hack, et également très enclins à faire des erreurs...
Peut-être qu'ils ont reçu cette erreur -
CollectionViewType property can only be set during Initialization.
C'est bizarre. Nous n'avons jamais se plaindre de upvotes...juste une pensée. Mais oui, nous sommes presque sûr qu'il l'a fait parce que le commentaire/post contribué à la personne.
Il n'est vraiment pas tout ce que bizarre. Si la réponse est déjà correct/utile alors il ne peut pas être autre chose qui permettrait de fournir des prestations en cours d'ajout. Toutefois, si une réponse n'est PAS correcte/utile alors il est toujours un avantage en expliquant pourquoi. De toute façon, c'est désormais la réponse malgré le fait d'avoir plusieurs downvotes plus de deux ans, quand j'ai fait mon commentaire initial.
Si vous obtenez ce message d'erreur "CollectionViewType propriété ne peut être défini lors de l'Initialisation.", il suffit de régler le CollectionViewType que le premier attribut dans le code XAML, avant tout autre attribut. Je sais que cette réponse est vieux, mais peut-être que cela peut être intéressantes à quelqu'un.
OriginalL'auteur spiderman