La Manipulation OnPropertyChanged
Je ne suis pas très versé dans l'événement de base de la programmation. En gros, je suis toujours en titubant avec elle. Je vais essayer d'obtenir quelque chose de mis en place, mais même avec les tutos, je ne peut pas envelopper la tête autour de lui. Ce que je voudrais faire (dans les mots) est le suivant:
-
J'ai un dataobject où la modification d'une propriété. J'ai remarqué cela dans le setter de la propriété, et que vous voulez élever un événement que la propriété a changé.
-
Ailleurs (dans une autre classe entièrement), je veux savoir que la propriété sur cet objet a changé, et prendre des mesures.
Maintenant, je suis sûr que c'est un scénario assez commun, mais mon google-fu est de me laisser descendre. Je suis tout simplement pas comprendre http://msdn.microsoft.com/en-us/library/ms743695.aspx.
J'ai ceci:
public class ChattyClass {
private int someMember;
public event PropertyChangedEventHandler PropertyChanged;
public int SomeMember {
get {
return this.someMember;
}
set {
if (this.someMember != value){
someMember = value;
//Raise event/fire handlers. But how?
}
}
}
public class NosyClass{
private List<ChattyClass> myChatters;
public void addChatter(ChattyClass chatter){
myChatters.add(chatter);
//Start listening to property changed events
}
private void listner(){
//I want this to be called when the PropertyChangedEvent is called
Console.WriteLine("Hey! Hey! Listen! A property of a chatter in my list has changed!");
}
}
Que dois-je faire pour la relier?
Concernant le commentaire de me pointer en arrière pour le lien:
Dans l'exemple que je vois:
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
Ce que je ne comprends pas:
- Pourquoi n'est-ce pas juste appeler
PropertyChanged(this, new PropertyCHangedEventArgs(name))
- Où PropertyChanged affectés?
- Ce qui ne l'attribution de ressembler?
- L'exemple que vous avez un lien pour montre la nécessaire
OnPropertyChanged
mise en œuvre; pouvez-vous être plus clair, où l'écart est ici? - Votre classe doit implémenter l'interface INotifyPropertyChanged pour le faire fonctionner. Donc, la première ligne doit être: public class ChattyClass : INotifyPropertyChanged {
- il n'est pas nécessaire de mettre en œuvre
INotifyPropertyChanged
. On peut juste ajouter lePropertyChanged
événement à toute la classe si il ne veut pas l'utiliser dans n'importe quel type de liaison de données. Mais de toute façon il est recommandé d'utiliser l'interface mentionnées. - Dans WPF/Silverlight, il est nécessaire. Reportez-vous à stackoverflow.com/questions/1644080/...
- Le lien est (effectivement) cassé.
Vous devez vous connecter pour publier un commentaire.
Vous avez pour déclencher l'événement. Dans l'exemple sur MSDN, ils ont fait une méthode protégée
OnPropertyChanged
pour gérer ce plus facile (et pour éviter de dupliquer du code).Ce que cette méthode, c'est de regarder si il y a un gestionnaire d'événement affecté ou pas (si il n'est pas attribué et vous l'appelez, vous obtiendrez un
NullReferenceException
). S'il en est affecté, appelez ce gestionnaire d'événement. Le gestionnaire d'événement prévu, doit avoir la signature de laPropertyChangedEventHandler
délégué. Cette signature est:Où le premier paramètre doit être du type de l'objet et représente l'objet qui déclenche l'événement, et le second paramètre contient les arguments de cet événement. Dans ce cas, votre propre classe les feux de l'événement et ainsi donner
this
comme paramètresender
. Le deuxième paramètre contient le nom de la propriété qui a changé.Maintenant pour être en mesure de réagir sur le tir de l'événement, vous devez affecter un gestionnaire d'événement de la classe. Dans ce cas, vous devez affecter cette dans votre
addChatter
méthode. En dehors de cela, vous devez d'abord définir votre gestionnaire. Dans votreNosyClass
vous aurez à ajouter une méthode pour ce faire, par exemple:Comme vous pouvez le voir, cette méthode correspond à la signature je l'ai expliqué avant. Dans le deuxième paramètre, vous serez en mesure de trouver les informations de paramètre a été modifié. La dernière chose à faire est d'ajouter le gestionnaire d'événement. Maintenant, dans votre
addChatter
méthode, vous devez affecter cette:Je vous suggère de lire quelque chose sur les événements dans l' .NET /C#: http://msdn.microsoft.com/en-us/library/awbftdfh . Je pense qu'après la lecture/l'apprentissage de cette, les choses seront plus claires pour vous.
Vous pouvez trouver une application console ici sur pastebin si vous souhaitez le tester rapidement (il suffit de copier/coller dans une nouvelle application de console).
Avec les nouvelles versions de C#, vous pouvez inline l'appel au gestionnaire d'événement:
Vous pouvez également utiliser quelque chose comme Fody PropertyChanged à généré automatiquement le code nécessaire (visitez le lien vers leur page GitHub, avec des échantillons).
chatter.PropertyChanged += new PropertyChangedEventHandler(chatter_PropertyChanged);
plutôt que de simplementchatter.PropertyChanged += chatter_PropertyChanged
+=
, VS vous suggère de générer automatiquement le gestionnaire d'événement et si vous appuyez sur la touche tab, il va insérer ce code).Le lien que vous avez cherché est pour le MVVM modèle et WPF. Ce n'est pas un général, C# de mise en œuvre. Vous avez besoin de quelque chose comme ceci:
...
Si vous voulez savoir ce que la propriété a changé, vous avez besoin de changer votre définition de l'événement à:
Et de modifier l'appel:
EventArgs.Empty
pour laPropertyChanged
événement. Le point de l'ensemble est le port d'écoute est au courant du nom de la propriété qui a changé.Parce que, si on ne joint un gestionnaire à l'événement, puis la
PropertyChanged
objet renvoienull
. Donc vous devrez vous assurer qu'il n'est pas null avant de l'appeler.Dans le "listener" les classes.
Par exemple, vous pourriez écrire dans d'autres classe:
En C#, nous utilisons les opérateurs d'affectation
+=
et-=
pour les événements. Je recommande la lecture de l'article suivant à comprendre comment écrire des gestionnaires d'événements à l'aide de la méthode anonyme formulaire (exemple ci-dessus) et les "vieux" de la forme.De prendre le code d'origine, et en intégrant @Styxxy 's réponse, je viens avec: