C#, WPF, MVVM et INotifyPropertyChanged

Je suis confus; j'ai cru comprendre INotifyPropertyChanged.

J'ai une petite application WPF, avec un frontend classe MainWindow, un viewmodel dans le milieu et d'un modèle à l'arrière.

Le modèle dans mon cas, c'est le Simulateur de classe.

La SimulatorViewModel est presque transparent et juste les propriétés des interfaces entre MainWindow et le Simulateur.

Simulateur implémente INotifyPropertyChanged et chaque accesseur de propriété dans le Simulateur appelle la RaisePropertyChanged méthode:

private string serialNumber;
public string SerialNumber
{
    get { return serialNumber; }
    set
    {
        serialNumber = value;
        RaisePropertyChanged("SerialNumber");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

public void RaisePropertyChanged(string propName)  
{  
    if (this.PropertyChanged != null)  
    {  
        this.PropertyChanged(this, new PropertyChangedEventArgs(propName));  
    }  
}    

Dans le code xaml, j'ai une zone de texte avec la liaison comme ceci:

Text="{Binding Path=SerialNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

et le DataContext est le SimulatorViewModel (mais voir mon commentaire sur la modification de la DataContext du modèle)

Le ViewModel transmet simplement les propriétés par:

public string SerialNumber  
{  
    get { return Simulator.SerialNumber; }  
    set { Simulator.SerialNumber = value; }  
}  

Programmatique des mises à jour de la propriété SerialNumber dans le Simulateur ne sont pas de multiplication jusqu'à l'INTERFACE utilisateur, bien que, curieusement, la valeur initiale, définie dans le Simulateur de constructeur, est de s'y rendre.

Si je pause sur le SerialNumber setter dans le Simulateur et de suivre RaisePropertyChanged, je trouve que PropertyChanged est nulle et si l'événement n'est pas la propagation vers le haut de l'interface graphique.

Ce qui m'amène à plusieurs questions:

  1. Exactement ce que devrait être d'accrochage dans l'événement PropertyChanged? Je suis à la recherche pour être plus précis, juste "WPF". Quel est le lien entre cet événement et l'engagement dans le code xaml?
  2. Pourquoi est la première valeur de la propriété pour arriver jusqu'à l'INTERFACE utilisateur au démarrage, mais pas par la suite?
  3. Suis-je en droit de Simulateur (le modèle) la mise en œuvre de INotifyPropertyChanged, ou faut-il le Dernier? Si le ViewModel t-il, alors programmatique des changements dans le modèle ne déclenchent pas PropertyChanged, je suis donc dans le flou sur le modèle correct. Je me rends compte de mon ViewModel est presque redondant, mais c'est dû à la simplicité du projet, de plus en plus complexes, on pourrait faire le ViewModel concept de travail plus difficile. Ma compréhension est que le ViewModel est le lieu de l'interface de mes tests unitaires.
Pourriez-vous inclure le code qui est en train de faire les mises à jour de la propriété SerialNumber?
SerialNumber = GenerateSerialNumber(); - je ne pense pas que ce soit le problème. Mais je viens de découvrir que si j'ai mis le DataContext de Simulateur (le modèle), tout cela fonctionne. Mais n'est-ce pas dire qu'un ViewModel est pas pertinent?
quel est votre SimulatorViewModel ressembler? De ce que je peux voir votre Simulateur de classe a pris le rôle de ce Dernier. Donc, actuellement votre SimulatorViewModel est redondante. Comment êtes-vous Simulateur de propagation des notifications à l'SimulatorViewModel?
J'ai mis un exemple SimulatorViewModel de la propriété dans le code ci-dessus pour plus de clarté. Oui, le viewmodel ne semble pas être pertinent dans un cas simple comme celui-ci comme je l'ai dit, mais dans un cas plus complexe, il serait utile. Je pense que vous avez raison à propos de la propagation du Simulateur de notifications à l'SimulatorViewModel. Est-ce le cas que le DataContext de lance de câblage de l'événement PropertyChanged? Cela expliquerait beaucoup de choses. Mais tout cela semble juste pour être à la pointe à la question "a quoi sert un ViewModel servent en fait?"

OriginalL'auteur Alan | 2011-02-11