WPF CollectionViewSource Plusieurs vues?
J'ai écrit un Contrôle WPF Personnalisé à la recherche d'extension, soit qu'il MyControl
.
Le Contrôle est un descendant d'un ItemsControl
classe.
J'ai donc nourrir les de la source de données comme cela:
Le contrôle de lui-même utilise
protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue)
{
if (newValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(newValue);
view.Filter += this.FilterPredicate;
}
if (oldValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(oldValue);
view.Filter -= this.FilterPredicate;
}
base.OnItemsSourceChanged(oldValue, newValue);
}
pour filtrer l'affichage de la collection source (donc de l'afficher dans un intérieur ListBox).
Maintenant, supposons que nous avons 10 de ces MyControls définis dans le code XAML avec la même DynamicSource.
Le problème est que si l'un d'eux s'applique le Filtre sur la source, de collecte, il aura une incidence sur toutes les autres instances.
Comment voulez-vous changer le Contrôle pour éviter ce comportement ?
source d'informationauteur PaN1C_Showt1Me
Vous devez vous connecter pour publier un commentaire.
Dans des situations comme cela, vous voudrez généralement de créer une instance ICollectionView pour chacun différemment filtré de l'utilisation de la collection. Ce n'est pas une bonne idée d'utiliser un spécifique de la mise en œuvre de ICollectionView puisqu'il est possible pour le CollectionView type de besoin de changer si l'ItemsSource est lié à un autre type de collection. À l'aide de
vous donnera une ICollectionView c'est le type correct automatiquement.
Malheureusement, ce que vous trouvez dans ce cas, c'est qu'il est très difficile à appliquer une collection différente de la ItemsPresenter de votre contrôle personnalisé depuis tous que la magie est faite pour vous par la base ItemsControl classe et s'appuie sur le ItemsSource/propriétés qu'il gère. Cela se produit lors de l'utilisation de quelque chose de semblable à ItemsControl du modèle par défaut.
Si vous êtes en fait en utilisant un contrôle de zone de liste (et objet templatebinding tous les ItemsSource propriétés si vous en avez besoin) à l'intérieur de votre ControlTemplate alors vous devriez être en mesure de simplement ajouter un nouveau ICollectionView DP (je recommanderais de lecture seule) sur votre contrôle pour tenir votre version filtrée de la collecte et de lier le modèle de zone de liste de ItemsSource à cette nouvelle propriété.
Le problème, c'est que
CollectionViewSource.GetDefaultView(object)
retournera toujours le mêmeICollectionView
exemple, pour une source donnée, et c'est ce que toutItemsControl
extension de l'utiliser lors de l'affichage de la source.Vous pouvez contourner ce problème en créant une nouvelle instance de
ICollectionView
à être utilisés par chaque commande que vous voulez être en mesure de façon indépendante filtre de la collection, puis explicitement la liaison de laItemsSource
de la propriété de chaque commande à ce point de vue spécifique. Le type deICollectionView
nécessaire dépendra de votre scénario, maisListCollectionView
est généralement approprié.