Y a-t-il un moyen de vous être averti lorsque l'emplacement actuel de la compositeCollection change? P>
Je dois avoir le compositCollection surveillé par une collectionView, toutes idées sont accueillies. P>
3 Réponses :
Vous pouvez détecter lorsque l'élément actuel a changé en surveillant l'événement code> icollectionview.CurrentChanged code> de votre collectionView. Le code suivant fonctionne pour moi:
CompositeCollection cc = new CompositeCollection(); cc.Add(new CollectionContainer { Collection = new string[] { "Oh No!", "Fie" } }); cc.Add(new CollectionContainer { Collection = new string[] { "Zounds", "Ods Bodikins" } }); CollectionViewSource cvs = new CollectionViewSource { Source = cc }; // Subscribing to CurrentChanged on the ICollectionView cvs.View.CurrentChanged += (o, e) => MessageBox.Show("current changed"); lb.ItemsSource = cvs.View; // lb is a ListBox with IsSynchronizedWithCurrentItem="True"
Le problème est que j'utilise la compositecollection qui est lié à deux objets de collectionViewsource différents. Lorsque j'ai changé l'emplacement dans la liste de liste (que IssynchronizedwithCurrentTem est évidemment défini sur TRUE), le Vendeur actuel (ED) n'est pas tiré.
Vous avez donc deux CVSS sur la même collection? Question muette, mais êtes-vous sûr que vous vous inscrivez à l'événement sur le bon CVS.View? Vous suggère de mettre à jour la question pour afficher le code qui ne fonctionne pas.
Peut-être que tu me dis comment faire. Souhaité, la change de courant doit être surveillée. Conclusion De toutes mes tentatives est que l'événement n'est pas tiré. Ce n'est pas une quête stupide, je pense que c'est plus compliqué que ce qu'il n'est; Je souhaite que ce ne soit pas.
Désolé, je voulais dire ma question ("Êtes-vous sûr que vous vous abonnez à l'événement sur la bonne vue CVS?") Était une question stupide "Vérification de la santé mentale". Je ne pense pas que votre question initiale soit stupide et ne voulait pas dire cela.
oh np merci. Quoi qu'il en soit, je pense que je suis inscrit à la bonne CVS, j'ai même créé un CV de test que sa source est la compositecollection et je ne suis pas averti, avez-vous déjà été dans cette situation? tout exemple serait apprécié. Merci pour tous vos efforts! BTW, j'ai vérifié votre blog, il y a des trucs incroyables surthermère!
BTW, je suppose que si j'ajoute des articles à cette collection, la compositecollection augmente aussi bien? Orelse La compositecollection ne connaît que des "objets" ajoutés à celui-ci, pas des collections.
Si la collection sous-jacente que vous ajoutez est inotifyCollectionChanged, alors oui, la compositecollection décrochera la modification (et vous verrez le nouvel élément dans la liste de liste). Dans mon échantillon, j'utilisais String [] de sorte que ce ne fonctionne pas b>. (Bien sûr, vous ne pouvez pas ajouter d'éléments aux tableaux de toute façon ... mais vous savez ce que je veux dire.) Si je change mon code pour utiliser Observablecollection
Y a-t-il un moyen de trier et de filtrer la compositecollection? Toute déposition / solution de contournement?
Vous ne pouvez pas exécuter une vue de collection sur une collection Composite, voir ici p>
Le tri et le filtrage sont moins importants pour moi. La priorité absolue est la change de courant. BTW Jetez un coup d'œil à ma discussion avec Itowlson ci-dessus, il dit qu'il va bientôt publier le code. Espérons que Godies ...
Vous pouvez, parce que c'est la façon dont les travaux de change - n'avaient pas compris les limitations - merci!
J'ai couru dans le même problème: j'avais besoin de tri de compositecollection. J'ai écrit la classe suivante qui résout le problème, au moins pour Observablecollections du même type.
L'idée est de maintenir la collection composite comme une collection observable ordinaire et de la mettre à jour car les collections sous-jacentes changent. Ensuite, la collection résultante (ALNOODES) peut être utilisée dans l'interface utilisateur et prend en charge la collectionView simplement bien. P>
using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; namespace Util { public class ObservableCollectionCollector<T> { private class ReplacableObservableCollection : ObservableCollection<T> { public void Replace(int idx, T v) { SetItem(idx, v); } } private readonly ReplacableObservableCollection allNodes; private readonly ObservableCollection<T>[] colls; private readonly int[] lens; public ObservableCollectionCollector(params ObservableCollection<T>[] colls) { this.colls = colls; allNodes = new ReplacableObservableCollection(); foreach (var l in colls) { foreach (var e in l) allNodes.Add(e); l.CollectionChanged += HandleCollectionChanged; } lens = colls.Select(c => c.Count).ToArray(); } public ReadOnlyObservableCollection<T> AllNodes { get { return new ReadOnlyObservableCollection<T>(allNodes); } } private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { int i0 = 0; int ci = 0; foreach (var l in colls) { if (l == sender) break; i0 += l.Count; ++ci; } switch (e.Action) { case NotifyCollectionChangedAction.Add: for (int i = 0; i < e.NewItems.Count; ++i) allNodes.Insert(i0 + e.NewStartingIndex + i, (T)e.NewItems[i]); break; case NotifyCollectionChangedAction.Move: for (int i = 0; i < e.OldItems.Count; ++i) allNodes.Move(i0 + e.OldStartingIndex + i, i0 + e.NewStartingIndex + i); break; case NotifyCollectionChangedAction.Remove: for (int i = 0; i < e.OldItems.Count; ++i) allNodes.RemoveAt(i0 + e.OldStartingIndex); break; case NotifyCollectionChangedAction.Replace: for (int i = 0; i < e.NewItems.Count; ++i) allNodes.Replace(i0 + e.OldStartingIndex + i, (T)e.NewItems[i]); break; case NotifyCollectionChangedAction.Reset: for (int i = 0; i < lens[ci]; ++i) allNodes.RemoveAt(i0); break; } lens[ci] = ((ObservableCollection<T>)sender).Count; } } }