web-dev-qa-db-fra.com

Comment puis-je m'abonner à l'événement PropertyChanged dans mon ViewModel?

J'ai des fonctionnalités de base encapsulées dans ViewModelBase

Maintenant, je veux voir quand l'événement PropertyChanged a été déclenché par ViewModelBase et agir en conséquence. Par exemple, lorsqu'une propriété a été modifiée sur ViewModelBase - je souhaite modifier la propriété sur mon ViewModel

Comment puis-je y parvenir?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup>
    {


public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
        where T : Entity
    {
20
katit

Je crains que vous ne fassiez effectivement une "liaison manuelle" (mauvaise) pour une propriété d'une classe dérivée à une valeur de la classe de base (également mauvaise). L'intérêt de l'utilisation de l'héritage est que la classe dérivée peut accéder aux éléments de la classe de base. Utilisez un modificateur protected pour indiquer que les choses ne doivent être accessibles qu'aux classes dérivées.

Je suggérerais cette méthode (potentiellement) plus correcte:

Classe de base:

protected virtual void OnMyValueChanged() { }

Classe dérivée:

protected override void OnMyValueChanged() { /* respond here */ }

Vraiment, s'abonner à un événement dans la classe de base de la classe même que vous écrivez semble incroyablement en arrière - quel est l'intérêt d'utiliser l'héritage sur la composition si vous allez vous composer autour de vous? Vous demandez littéralement à un objet de se dire quand quelque chose se passe. Un appel de méthode est ce que vous devez utiliser pour cela.

En termes de "quand une propriété a été modifiée sur ViewModelBase - je veux changer la propriété sur mon ViewModel", ... ce sont le même objet!

11
Kieren Johnstone

Habituellement, j'utilise l'inscription à l'événement PropertyChanged dans la classe Constructor

public MyViewModel()
{
    this.PropertyChanged += MyViewModel_PropertyChanged;
}

et mon gestionnaire d'événements PropertyChanged ressemble à ceci:

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "SomeProperty":
            // Do something
            break;
    }
}
57
Rachel

La manière directe de s'abonner aux modifications de propriétés consiste à utiliser INotifyPropertyChanged si votre BaseViewModel l'implémente:

PropertyChanged += (obj, args) =>
   { System.Console.WriteLine("Property " + args.PropertyName + " changed"); }

Si ce n'est pas le cas, alors ce doit être un DependencyObject, et vos propriétés doivent être DependencyProperties (ce qui est probablement une manière plus compliquée).

Cet article décrit comment s'abonner aux modifications DependencyProperty.

2
Vlad