WPF Benachrichtigen PropertyChanged für eine Get-Property
Habe ich die INotifyPropertyChanged
umgesetzt mit CallerMemberName
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Also das könnte genannt werden, in den setter für jede Eigenschaft wie - OnPropertyChanged()
welche melden würde property-changed-Ereignis, sobald es festgelegt wird. Dies ist nicht der Fall für eine Eigenschaft eine getter-only. Zum Beispiel,
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()
funktioniert gut für DateOfBirth, aber zu Benachrichtigen Alter geändert, ich sollte mich daran erinnern zu rufen OnPropertyChanged("Age")
innerhalb der setter DateOfBirth
. Ich finde das macht den code schwer zu pflegen sind im Laufe der Zeit. Wenn eine neue Eigenschaft ist abhängig von Alter, muss auch Benachrichtigt werden, der setter DateOfBirth. Gibt es einen besseren Weg, dies zu tun, ohne Aufruf von OnPropertyChanged("Alter")?
OnPropertyChanged()
funktioniert nur auf setter? Wenn nicht, könnten Sie versuchen, setzen die return
- Anweisung in einem try-finally, und rufen Sie die OnPropertyChanged()
es.Könnten Sie bitte erläutern. OnPropertyChanged funktioniert immer, aber es sollte nur benachrichtigt, wenn jemand ändert den Wert. Es macht also Sinn, um es im setter. Ich verstehe nicht, wo und warum ich benötigen ein try-finally?
Wenn Sie nicht wollen, zu nennen
OnPropertyChanged("Age")
mit "Alter" als parameter beim festlegen der DOB-Wert, auf den Age's get
Sie zurückgeben konnte der Wert innerhalb eines try
, und im inneren der finally
zu nennen, könnten Sie die OnPropertyChanged()
, ohne die parameter.Das wird nicht funktionieren. Der Grund, warum ich bin mit OnPropertyChanged ist, wenn jemand änderungen DOB, OnPropertyChanged auslösen Benutzeroberfläche Zugriff Get Alter. Wenn ich mich bewege OnpropertyChanged innerhalb von Alter, es wird in einer Endlosschleife wieder und wieder versuchen, Zugang zu bekommen und immer eine änderungsbenachrichtigung.
Guilherme Kommentare machen überhaupt keinen Sinn. Eigenschaft Benachrichtigung muss natürlich etwas getan werden, wenn die Einstellung, nicht immer, und try/finally-bringt nichts (außer das Ereignis ausgelöst werden, selbst wenn es eine Ausnahme in der getter, das ist einfach nur Bizarr).
InformationsquelleAutor Carbine | 2014-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Solange Ihr abhängige Eigenschaft ist in der gleichen Klasse, die Sie verwenden können, Poma Ansatz, aber wenn sich die abhängigen Eigenschaften werden in verschiedenen Klassen seine immer härter mit diesem Ansatz.
Meiner Meinung nach die konzeptionell richtige Sache zu tun wäre, um fügen Sie ein PropertyChanged-Hörer.
In diesem Fall wäre das so etwas wie
Im Konstruktor:
Und außen:
Diese dann auch funktioniert, wenn Sie eine abhängige Eigenschaft irgendwo ganz anders, und auch wenn Sie nicht ändern Sie Ihren source-Klasse mehr.
InformationsquelleAutor blacktemplar
Einen Weg, dies zu tun ist, um zu definieren, Ihre attribute und einige Reflexion in
OnPropertyChanged
zu Benachrichtigen, alle abhängigen Eigenschaften. Sie möchten möglicherweise die cache-Attribute zu verwenden, nur Reflexion-in-class-Initialisierer, denn Reflexion ist ziemlich langsam.konnte ihn nicht finden in google. Aber es gibt namespaces, um Konflikte zu vermeiden, sowieso.
Was ist das Attribut DependsOnProperty? Ist etwas, das die OP durchführen und Sie sind damit nur ein Beispiel?
InformationsquelleAutor Poma