WPF Informer PropertyChanged pour Obtenir la Propriété
J'ai le INotifyPropertyChanged
mis en œuvre à l'aide de CallerMemberName
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Ce qui pourrait être appelé dans le setter de la propriété en tant que - OnPropertyChanged()
qui serait en aviser propriété a changé de cas chaque fois que c'est réglé. Ce n'est pas le cas pour une propriété d'une lecture seulement. Par exemple,
private DateTime _dob;
public DateTime DateOfBirth
{
get
{
return _dob;
}
private set
{
_dob = value;
OnPropertyChanged();
OnPropertyChanged("Age");
}
}
public int Age
{
get
{
return DateTime.Today.Year - _dob.Year;
}
}
OnPropertyChanged()
fonctionne très bien pour DateOfBirth, mais à en informer l'Âge changé, je dois me rappeler d'appeler OnPropertyChanged("Age")
au sein de l'incubateur de DateOfBirth
. Je pense que ça rend le code difficile à maintenir dans le temps. Si une nouvelle propriété dépend de l'Âge, qui doit aussi être Notifié dans le setter de DateOfBirth. Est-il une meilleure façon de le faire sans faire appel OnPropertyChanged("Age")?
OnPropertyChanged()
ne fonctionne que sur setter? Si non, vous pouvez essayer de mettre le return
déclaration dans un try-finally, et d'appeler la OnPropertyChanged()
.Pourriez-vous donner des précisions. OnPropertyChanged fonctionne toujours, mais il doit être averti quand quelqu'un change la valeur. Il est donc logique d'avoir dans setter. Je ne comprends pas d'où et pourquoi j'aurai besoin d'un try-finally?
Si vous ne souhaitez pas appeler
OnPropertyChanged("Age")
, avec "l'Âge" comme paramètre lorsque vous définissez la date de naissance de valeur, sur le Age's get
vous pouviez retourner de la valeur à l'intérieur d'un try
, et à l'intérieur de la finally
, vous pourriez appeler la OnPropertyChanged()
, sans le paramètre.Cela ne fonctionnera pas. La raison pour laquelle je suis à l'aide de OnPropertyChanged est, si quelqu'un change la date de naissance, OnPropertyChanged sera le déclencheur de l'INTERFACE utilisateur pour accéder à Obtenir de l'Âge. Si je déplace OnpropertyChanged au sein d'Obtenir de l'Âge, il va aller dans une boucle infinie de nouveau et de nouveau essayer d'obtenir l'accès et obtenir un changement de la notification.
Guilherme commentaires de n'avoir aucun sens. Propriété de notification doit évidemment être fait lors de la configuration, de ne pas arriver, et try/finally ne réalise rien (autre que le feu de l'événement, même quand il y a une exception dans la lecture, ce qui est tout à fait étrange).
OriginalL'auteur Carbine | 2014-02-14
Vous devez vous connecter pour publier un commentaire.
Aussi longtemps que votre charge de la propriété est dans la même classe, vous pouvez utiliser Poma de l'approche, mais si les propriétés dépendantes sont dans des classes différentes de son de plus en plus difficile avec cette approche.
À mon avis, sur le plan conceptuel bonne chose à faire serait d'ajouter un PropertyChanged auditeur.
Dans ce cas, ce serait quelque chose comme
Dans le constructeur:
Et à l'extérieur:
Ensuite, cela fonctionne également si vous avez une personne à charge de la propriété quelque part complètement différent et aussi si vous ne pouvez pas modifier votre classe de source plus.
OriginalL'auteur blacktemplar
Une façon de le faire est de définir votre attribut et faire un peu de réflexion dans
OnPropertyChanged
notifier toutes les propriétés dépendantes. Vous souhaitez peut-être cache des attributs à utiliser la réflexion que dans la classe initialiseur, car la réflexion est assez lent.ne l'a pas trouvé dans google. Mais il y a des espaces de noms pour éviter les conflits de toute façon.
Qu'est-ce que l'attribut DependsOnProperty? Est quelque chose que l'OP a à mettre en œuvre et vous êtes juste de donner un exemple?
OriginalL'auteur Poma