ObservableCollection Fusionné
J'ai deux ObservableCollections et j'ai besoin de les afficher dans un contrôle ListView ensemble. Pour cela j'ai créé MergedCollection qui présente ces deux collections, comme une ObservableCollection. De cette façon, je peux mettre la liste.ItemsSource de mon fusionné collection et les deux collections sont répertoriés. L'ajout fonctionne très bien mais lorsque j'essaie de Supprimer un élément, exception non gérée s'est montré:
An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll
Additional information: Added item does not appear at given index '2'.
Le code de MergedCollection suit:
public class MergedCollection : IEnumerable, INotifyCollectionChanged
{
ObservableCollection<NetworkNode> nodes;
ObservableCollection<NodeConnection> connections;
public MergedCollection(ObservableCollection<NetworkNode> nodes, ObservableCollection<NodeConnection> connections)
{
this.nodes = nodes;
this.connections = connections;
this.nodes.CollectionChanged += new NotifyCollectionChangedEventHandler(NetworkNodes_CollectionChanged);
this.connections.CollectionChanged += new NotifyCollectionChangedEventHandler(Connections_CollectionChanged);
}
void NetworkNodes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
CollectionChanged(this, e);
}
void Connections_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
CollectionChanged(this, e);
}
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
for (int i = 0; i < connections.Count; i++)
{
yield return connections[i];
}
for (int i = 0; i < nodes.Count; i++)
{
yield return nodes[i];
}
}
#endregion
#region INotifyCollectionChanged Members
public event NotifyCollectionChangedEventHandler CollectionChanged;
#endregion
}
Ce qui concerne
source d'informationauteur Zefo
Vous devez vous connecter pour publier un commentaire.
Est-il une raison vous ne pouvez pas utiliser CompositeCollection?
La raison pour laquelle l'exception est levée est parce que vous n'êtes pas la traduction de l'index de l'intérieur de collections à l'extérieur. Que vous soyez simplement de passage exactement le même événement args à l'extérieur de l'événement (sur
MergedCollection
), c'est pourquoi WPF ne trouve pas les éléments pour lesquels l'indice est en disant qu'il les trouver.Vous avez pour compenser l'indice de la notification de l'événement.
Dire que vous supprimez un élément de la première collection à l'index 2. Une collection changé événement est déclenché avec l'index 2.
Si vous supprimez un élément de la deuxième collection à l'index 2, l'événement est déclenché avec le même indice (2), mais l'article est effectivement énumérés à la suite de tous les articles dans le première collection.