Liste<T> cuisson Événement sur le Changement
J'ai créé une Classe EventList hériter Liste qui déclenche un Événement à chaque fois que quelque chose est Ajouté, Insérés ou Retirés:
public class EventList<T> : List<T>
{
public event ListChangedEventDelegate ListChanged;
public delegate void ListChangedEventDelegate();
public new void Add(T item)
{
base.Add(item);
if (ListChanged != null
&& ListChanged.GetInvocationList().Any())
{
ListChanged();
}
}
...
}
Pour le Moment je l'utilise comme une Propriété comme ceci:
public EventList List
{
get { return m_List; }
set
{
m_List.ListChanged -= List_ListChanged;
m_List = value;
m_List.ListChanged += List_ListChanged;
List_ListChanged();
}
}
Maintenant, mon Problème est, je peux en quelque sorte la poignée si un Objet est saisi, soit l'en empêcher, donc je n'ai pas à faire l'événement de câblage des trucs dans l'incubateur?
Bien sûr, je peux changer la propriété "mode privé", mais je voudrais être en mesure d'utiliser la classe en tant que variables.
Pourquoi ne pas utiliser ObservableCollection
Il n'est pas clair ce que vous demandez. Pouvez-vous donner un exemple de ce que vous voulez afin de prévenir ou de ce que vous voulez autoriser.
Merci de poster votre List_ListChanged(). De quoi êtes-vous attacher à éviter?
Il n'est pas clair ce que vous demandez. Pouvez-vous donner un exemple de ce que vous voulez afin de prévenir ou de ce que vous voulez autoriser.
Merci de poster votre List_ListChanged(). De quoi êtes-vous attacher à éviter?
OriginalL'auteur Martin | 2012-10-08
Vous devez vous connecter pour publier un commentaire.
Il est rare que vous créez une nouvelle instance d'une classe de collection dans une classe. Instancier qu'une fois et le clair au lieu de créer une nouvelle liste. (et l'utilisation de l'ObservableCollection, car il a déjà le INotifyCollectionChanged interface héritée)
De cette façon, vous n'avez qu'à raccorder des événements une fois, et peut "réinitialiser" en appelant la méthode claire au lieu de vérifier la valeur null ou de l'égalité de l'ancienne liste dans l'accesseur set de la propriété.
Avec les changements dans C#6, vous pouvez attribuer une propriété à partir d'un constructeur sans l'appui de champ (le champ de stockage est implicite)
Donc le code ci-dessus peut être simplifié à
public ObservableCollection<T> List { get; private set; }
Je vais aller avec cette.Rendant readonly et paramètre dans le constructeur seront les seuls à ajouter une contrainte que vous ne pouvez pas définir de n'importe où ailleurs. Autoproperties sont bien, mais quand un champ ne doit être définie une fois, je le fais en lecture seule et l'utilisation d'un champ de stockage à la place.
OriginalL'auteur Patrick
ObservableCollection une Liste avec un événement CollectionChanged
ObservableCollection.Événement CollectionChanged
De la façon de câbler le gestionnaire d'événements de voir la réponse de Patrick. +1
Vous ne savez pas ce que vous cherchez, mais je l'utiliser pour une collection avec un événement qui se déclenche sur ajouter, supprimer et modifier.
Appris quelque chose de nouveau. Good Bye EventList, Bonjour ObservaleCollection!
OriginalL'auteur paparazzo
Si vous ne voulez pas ou ne pouvez pas convertir une Collection Observable, essayez ceci:
Maintenant, pour votre bien, vous devriez être en mesure de réduire votre code:
Pourquoi? Réglage de quoi que ce soit dans le EventList.Les éléments à contacter en privé
notify()
routine.IList<T>
interface!La définition d'Ajouter que
new
fera((IList)list).Add(item)
de ne pas déclencher la méthode de notification.Il va parce que j'ai ajouté le
notify()
appeler à Ajouter une Propriété.Aussi, je ne suis pas sûr pourquoi l'OP défini Ajouter que
new
- j'ai juste utilisé ce qu'il avait. Je suppose qu'il a ses raisons.Il ne sera pas si vous utilisez la classe de base, comme démontré par un exemple dotnetpad.net/ViewPaste/IYP6mJpXqUmpISCDe28YKA. Je ne blâme pas vous mais, je voulais juste faire une note de celui-ci, d'être prudent lors de l'utilisation de nouveau sur une méthode. Vous n'avez même pas besoin puisque vous êtes à l'aide de l'interface IList au lieu de la Liste de classe, de sorte que le problème disparaisse de lui-même dans votre exemple 😉
OriginalL'auteur jp2code
J'ai une Solution pour quand quelqu'un appelle la méthode Générique de IList.add(object). De sorte que vous obtenez également notifié.
OriginalL'auteur Daniel
Si une ObservableCollection n'est pas la solution pour vous, vous pouvez essayer ça:
A) mettre en Œuvre une coutume EventArgs qui contiendra le nouveau Comte d'attribut lorsque l'événement sera déclenché.
B) mettre en Œuvre une Liste personnalisée qui hérite de la Liste et de redéfinir le Comte d'attribut et les constructeurs en fonction de vos besoins:
C) Enfin de s'abonner à votre événement:
OriginalL'auteur Nicolas Bodin-Ripert