Dans WPF, vous pouvez filtrer un objet collectionviewsource sans code derrière?
Vraiment le sujet dit tout.
<CollectionViewSource x:Key="MyData"
Source="{Binding}" Filter="{ SomethingMagicInXaml? }" />
Ce n'est pas que je ne peux pas avoir le code derrière. Il vient de nags à moi.
OriginalL'auteur Jerry Nixon - MSFT | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire à peu près n'importe quoi dans le code XAML si vous essayez assez dur", jusqu'à l'écriture de l'ensemble des programmes en elle.
Vous n'obtiendrez jamais de code autour de derrière (enfin, si vous utilisez les bibliothèques vous n'avez pas à écrire, mais l'application repose toujours sur elle, bien sûr), voici un exemple de ce que vous pouvez faire dans ce cas précis:
Extensions de balisage sont à votre ami si vous voulez faire quelque chose dans le code XAML.
(Vous pouvez épeler le nom de l'extension, c'est à dire
me:FilterExtension
comme à la volée de la vérification dans Visual Studio peut se plaindre sans raison, encore compile et s'exécute bien sûr, mais les avertissements pourraient être ennuyeux.Aussi, ne pas s'attendre à la
CollectionViewSource.Filter
de le montrer dans l'IntelliSense, il ne vous attendez pas à définir ce gestionnaire via XML de l'élément de notation)Levesque: je n'ai bien sûr, il a travaillé!
Ce qui est propre, je n'étais pas au courant de cette nouvelle fonctionnalité!
J'obtiens une exception : les Filtres ne prend pas en charge les valeurs de Type PropertyFilter.
est-il compiler?
OriginalL'auteur H.B.
Fait, vous n'avez même pas besoin d'accéder à la
CollectionViewSource
exemple, vous pouvez filtrer la collection source directement dans le ViewModel:(notez que
ICollectionView.Filter
n'est pas un événement comme lesCollectionViewSource.Filter
, c'est une propriété de typePredicate<object>
)le titre dit "sans code derrière"; pour moi, il signifie habituellement "dans le ViewModel", mais maintenant je me rends compte que l'OP a demandé en particulier que XAML solution...
Nixon, c'est pas code-behind; c'est le code d'un ViewModel. À moins, bien sûr, vous envisagez de C# code comme le code-behind...
+1 parce que votre réponse n'est PAS le code-behind, c'est dans le ViewModel.
ce n'est pas une vue de l'INTERFACE utilisateur de sens; un CollectionView est plus une vue de la DB sens...
OriginalL'auteur Thomas Levesque
WPF crée automatiquement un
CollectionView
--ou type dérivé commeListCollectionView
,BindingListCollectionView
, etc. (elle dépend des capacités détecté sur votre source de collecte) - pour touteItemsSource
de liaison, si vous ne fournissez pas un quand vous liez votreIEnumerable
origine provenant directement d'unItemsControl.ItemsSource
propriété.Automatiquement fourni
CollectionView
instance est créée et maintenue par le système sur un par collection (note: pas par l'INTERFACE utilisateur de contrôle ou de liaison cible). En d'autres termes, il y aura exactement un globalement partagés "par Défaut" pour chaque source que vous liez, et cette uniqueCollectionView
instance peut être extrait (ou créés sur demande) à tout moment en passant par leIEnumerable
à la méthode statiqueCollectionViewSource.GetDefaultView()
.Parfois, même si vous essayez de lier explicitement votre propre
CollectionView
-type dérivé d'unItemsSource
, WPF moteur de liaison de données peut passer à la ligne (à l'aide du type interneCollectionViewProxy
).Dans tous les cas, chaque
ItemsControl
avec une liaison de donnéesItemsSource
propriété sera toujours jusqu'à la fin avec le tri et le filtrage des capacités, avec l'aimable autorisation de certaines vigueurCollectionView
. Vous pouvez facilement effectuer le filtrage de tri pour toutIEnumerable
par l'accaparement et la manipulation de son "Défaut"CollectionView
, mais notez que toutes les données des objectifs assortis d'échéances dans l'INTERFACE utilisateur qui finissent à l'aide de ce point de vue soit parce que vous l'avez explicitement lié àCollectionViewSource.GetDefaultView()
, ou parce que vous n'avez pas à tout-va partageons tous le même tri/filtrage des effets.Cela permet à de nombreux XAML simplifiée scénarios:
Si le fait d'avoir un unique, universellement partagé le filtre/tri de la capacité pour le
IEnumerable
source est suffisante pour votre application, puis il suffit de se lier directement àItemsSource
. Toujours dans XAML seulement, vous pouvez ensuite filtrer/trier les éléments par le traitement de laItems
de propriété sur le même Contrôle qu'uneItemCollection
liaison source. Il a de nombreuses propriétés qui peuvent être liées pour contrôler le filtre/tri. Comme l'a noté, de filtre et de tri seront partagés entre tous les éléments d'INTERFACE qui sont liés à la même sourceIEnumerable
de cette façon. --ou--De créer et d'appliquer un ou plusieurs distincts (non"par Défaut")
CollectionView
cas vous-même. Cela permet à chaque liaison de données cible indépendants filtre/tri paramètres. Cela peut aussi être fait dans XAML, et/ou vous pouvez créer votre propre(List)CollectionView
les classes dérivées. Ce type d'approche est bien couvert ailleurs, mais ce que je voulais souligner ici est que, dans de nombreux cas, le XAML peut être simplifié en utilisant la même technique de de liaison de données à laItemsControl.Items
propriété (comme une liaison source) afin d'accéder à la efficaceCollectionView
.Résumé:
Avec XAML seul, vous pouvez des données se lier à une collection représentant le des résultats efficaces de tout courant
CollectionView
, le filtrage, le tri WPFItemsControl
par le traitement de sesItems
propriété en lecture seule liaison source. Ce sera unSystem.Windows.Controls.ItemCollection
qui expose bindable/mutable propriétés pour contrôler le filtre actif et des critères de tri.[edit -- réflexions:]
Noter que dans le cas simple de la liaison de votre
IEnumerable
directement àItemsSource
, leItemCollection
que vous pouvez lier àItemsControl.Items
sera un wrapper sur l'original de la collectionCollectionViewSource.GetDefaultView()
. Comme discuté ci-dessus, dans XAML d'utilisation c'est un no-brainer pour se lier à cette INTERFACE utilisateur wrapper (viaItemsControl.Items
), par opposition à la liaison à la vision sous-jacente qu'il l'enveloppe (viaCollectionViewSource.GetDefaultView
), depuis la première approche vous permet d'économiser la peine de mentionner unCollectionView
à tous.Mais de plus, parce que
ItemCollection
enveloppements la valeur par défautCollectionView
, il me semble que, même dans code-behind (où le choix est moins évident) c'est peut-être plus utile de se lier à la vue promulgué par l'INTERFACE utilisateur, puisque tel est susceptible de mieux à l'écoute des capacités de la source de données et son INTERFACE de contrôle de la cible.OriginalL'auteur Glenn Slayden