Wie kann man eine Abhängigkeitseigenschaft registrieren, deren Wert mit dem Wert einer anderen Abhängigkeitseigenschaft berechnet wird?Abhängigkeitseigenschaft abhängig von einer anderen
Da die .NET-Eigenschaftenwrapper zur Laufzeit von WPF umgangen werden, sollte keine Logik in die Getter und Setter einbezogen werden. Die Lösung dafür ist typischerweise PropertyChangedCallback
s zu verwenden. Aber diese werden als statisch deklariert.
Zum Beispiel, was ist der richtige Weg, diese erfundene Aufgabe zu erfüllen:
public bool TestBool
{
get { return (bool)GetValue(TestBoolProperty); }
set
{
SetValue(TestBoolProperty, value);
TestDouble = ((value)?(100.0):(200.0)); // HERE IS THE DEPENDENCY
}
}
public static readonly DependencyProperty TestBoolProperty =
DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel));
public double TestDouble
{
get { return ((double)GetValue(TestDoubleProperty)); }
set { SetValue(TestDoubleProperty, value); }
}
public static readonly DependencyProperty TestDoubleProperty =
DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel));
Solange die Abhängigkeit nicht kreisförmig ist, ist es ein geeignetes Mittel, um dies zu erreichen?
Was ist der Vorteil der Verwendung eines 'CoerceValueCallback's, wie Sie es getan haben, im Vergleich zu einer direkten Änderung einer Abhängigkeitseigenschaft aus einer anderen Abhängigkeitseigenschaft' PropertyChangedCallback', wie es opedog getan hat? Ich entnehme der Dokumentation, die Sie verlinkt haben, dass Ihre Methode die geeignetere ist, aber ich bin neugierig auf den praktischen Unterschied. – Gregyski
Nun, um ein paar zu nennen: Es bricht die Bindungen zu dieser Eigenschaft nicht (d. H. Wenn diese Eigenschaft ein Ziel des Bindungsausdrucks ist, wird sie nach der Zwangsführung funktionieren, wird aber nach der expliziten Festlegung verloren gehen); es hat eine höhere Priorität bei der Auflösung von Abhängigkeitseigenschaftswerten (d. h., wenn Sie PropA = "Etwas" sagen, was nicht bedeutet, dass PropA == "Etwas" ist, da die Zwangsumsetzung diese Zuweisung ignorieren könnte); Es merkt sich den alten Wert Ihrer Eigenschaft (d. H. Beim nächsten Aufruf von CoerceValue() erhalten Sie den ursprünglichen Wert von TestDouble, nicht den, der lokal gesetzt wurde) – Anvaka