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
{
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!
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;
}
}
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
.