2010-09-09 25 views
0

J'ai récemment découvert une interface INotifyPropertyChange. J'ai réussi à implémenter cette interface dans mon clss et tout fonctionne bien. Cependant, je me demandais s'il est possible d'intercepter cet événement dans le code et le feu d'une fonction Disons que j'ai une fonctionComment intercepter l'événement NotifyPropertyChange

DoStuff() 

et je wan't pour tirer cette fonction everytime changements Propriété1, Propriété2 ou property3. Bien sûr, je pourrais mettre cette fonction en bloc dans ma classe mais ce n'est pas une bonne idée (je pense).

+0

Veuillez spécifier dans la question s'il existe d'autres propriétés que vous souhaitez filtrer, qui déclenchent l'événement NotifyPropertyChanged. –

Répondre

1

Si vous voulez dire à la méthode interne qui va gérer cet événement, vous pouvez le faire en vous inscrivant à l'événement dans le constructeur de la classe. Par exemple:

public class AnswerViewModel : IAnswerViewModel 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string content; 

    public AnswerViewModel() 
    { 
     PropertyChanged += (sender, args) => DoStuff(); 
    } 

    public string Content 
    { 
     get { return content; } 
     set 
     { 
      content = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Content")); 
     } 
    } 

    public void DoStuff() 
    { 
     // this method will be called whenever PropertyChanged event raised 
    } 
} 

Si la méthode d'interception appartient à d'autres classes:

public class PropertiesInterceptor 
{ 
    private readonly AnswerViewModel viewModel; 

    private readonly List<string> propertiesToIntercept = 
     new List<string> { "property1", "property2", "property3" }; 

    public PropertiesInterceptor(AnswerViewModel viewModel) 
    { 
     this.viewModel = viewModel; 
     viewModel.PropertyChanged += OnPropertyChanged; 
    } 

    private void OnPropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 
     if (propertiesToIntercept.Contains(args.PropertyName)) 
     { 
      DoStuff(); 
     } 
    } 

    private void DoStuff() 
    { 
     // Do something with viewModel 
    } 
} 
+0

Vous pouvez remplacer votre événement par 'PropertyChanged + = (expéditeur, args) => if (args.PropertyName = = "propriété1" || args.PropertyName == "propriété2" || args.PropertyName == "propriété3") DoStuff(); ' –

+0

Hmm et si la fonction que je veux appeler est dans une autre classe? – Berial

+0

@Berial, ajouté l'exemple d'utilisation à l'interception de classe différente de celle soulevant le 'PropertyChanged' – Elisha

0

Avez-vous besoin pour remplacer les gestionnaires d'événements NotifyPropertyChanged existants, ou tout simplement s'appeler quand NotifyPropertyChanged est appelé?

Si vous voulez dire que le second, vous pouvez simplement enregistrer un gestionnaire d'événements

modifier

Vous pouvez ajouter un gestionnaire d'événements qui est appelé à NotifyPropertyChanged, vérifie si le paramètre de propriété est égale à Propriété1, Property2, ou Property3, et seulement ensuite le transmet à la fonction réelle que vous souhaitez appeler.

+0

Je dois appeler la fonction lorsque NotifyPropertyChanged est appelée - mais seulement si Property1, Property2 ou Property3 a été modifié – Berial

0

Vous pouvez tirer la méthode d'une méthode RaisePropertyChanged():

public int Property1 
{ 
    get { return this.property1; } 
    set 
    { 
     if (this.property1 != value) 
     { 
      this.property1 = value; 
      RaisePropertyChanged("Property1"); 
     } 
    } 
} 

private void RaisePropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    DoStuff(); // Call DoStuff here. 
} 
0

Stealing la réponse d'Élisée pour répondre à votre question dans la réponse de Merlyn

public class AnswerViewModel : IAnswerViewModel 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string property1; 
    private string property2; 
    private string propertyX; 

    public AnswerViewModel() 
    { 
     PropertyChanged += (sender, args) => 
     { 
      if(args.PropertyName == "Property1" || args.PropertyName == "Property2") 
       DoStuff(); 
     } 
    } 

    public string Property1 
    { 
     get { return content; } 
     set 
     { 
      property1 = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Property1")); 
     } 
    } 
    public string Property2 
    { 
     get { return content; } 
     set 
     { 
      property2 = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Property2")); 
     } 
    } 
    public string PropertyX 
    { 
     get { return content; } 
     set 
     { 
      propertyX = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("PropertyX")); 
     } 
    } 

    public void DoStuff() 
    { 
     // this method will be called whenever PropertyChanged event raised from Property1 or Property2 
    } 
} 

Si la classe DoS tuf est en est membre, vous pouvez faire

private otherClass 
    public AnswerViewModel() 
    { 
     PropertyChanged += (sender, args) => 
     { 
      if(args.PropertyName == "Property1" || args.PropertyName == "Property2") 
       otherClass.DoStuff(); 
     } 
    } 

Sinon, vous ne pourrez avoir AutreClasse enregistrer un événement sur son propre dans votre code principal.