Laden...

DependencyProperty: ChangedCallback von Property wird nicht ausgelöst

Erstellt von Cannon vor 11 Jahren Letzter Beitrag vor 11 Jahren 614 Views
C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 11 Jahren
DependencyProperty: ChangedCallback von Property wird nicht ausgelöst

Ich habe ein eigenes UserControl geschrieben, welches DependencyPropertys hat. Eines eben dieser Properties mchte auch andere DependencyProperties setzen. Allerdings klappt dann das ChangedCallback dieser Properties nicht immer und zuverlässig. Gibt es da was zu beachten? Darf man diese DependencyProperties überhaupt "intern" beschreiben?

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Cannon,

ich bin leider kein Experte für DependencyProperties. Allerdings ist das Grundprinzip gerade, dass der Wert einer Property sich aus mehreren Quellen ergibt, wobei die verschiedenen Quellen unterschiedlichen Vorrang voreinander haben. Insofern ist es aus meiner Sicht erstmal grundsätzlich ok, wenn eine Property den Wert einer anderen beeinflusst.

Ich weiß nun nicht, ob die ChangedCallbacks nur ausgelöst werden, wenn der Wert sich tatsächlich geändert hat. Wenn die ChangedCallbacks auch ausgelöst werden, wenn der Wert gesetzt wird, ohne dass er sich geändert hat, dann kann es eine Endlosrekursion geben, wenn Properties sich gegenseitig ändern.

Kannst du bitte die Situation, in der sich die Properties bei dir ändern, genauer beschreiben?

Was genau meinst du "klappen" in "Allerdings klappt dann das ChangedCallback dieser Properties nicht immer und zuverlässig." Wird es nicht ausgelöst? Oder führt eine Änderung innerhalb eines ChangedCallback nicht dazu, dass der Wert sich ändert?

herbivore

C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 11 Jahren

Ja das Problem an sich habe ich, dank deiner Tipps auch genauer nachvollziehen können. Das ChangedCallbacks wird nur dann ausgelöst, wenn tatsächlich der Wert des Properties sich ändert. Bei einem herkömmlichen Property kann ich das selbst entscheiden, indem ich value mit meinem Property Speicher vergleiche. Bei den DependencyProperties geht das so nicht. Demnach bleibt mir nur die Möglichkeit an anderer Stelle die Initialisierungen durchzuführen.

	
public static readonly DependencyProperty GalaMessageProperty =
			DependencyProperty.Register("GalaMessage", typeof(DialogMessage), typeof(MessageBoxDialog),
			new FrameworkPropertyMetadata(null, GalaMessagChangedCallback) { BindsTwoWayByDefault = true });

public static void GalaMessagChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			MessageBoxDialog dlg = (MessageBoxDialog)d;
			DialogMessage message = (DialogMessage)e.NewValue;
			if (message != null) {
				dlg.Text = message.Content;
				dlg.Caption = message.Caption;
				dlg.Icon = message.Icon;
				dlg.Button = message.Button;
				dlg.IsShown = true;
			} else {
				dlg.Text = null;
				dlg.Caption = null;
				dlg.IconImage = null;
				dlg.Commands = null;
				dlg.Button = new MessageBoxButton();
				dlg.IsShown = false;
			}
		}

Wenn sich GalaMessage nicht ändert, sondern nur deren Member, dann passiert hier nichts und das ist das Problem. Ich kann nur "intern" GalaMessage auf null setzen. Aber das gefällt mir nicht, das ja vom Nutzer des UserControls evtl. nicht gewünscht wird.

Möglicherweise kommt mir gerade die Idee das Property IsShown zu nutzen und genau dort alle Properties zu setzen, dann sollten die anderen Probleme vom Tisch sein. Hier wäre es allerdings besser nicht ein Changed, sondern ChangeCallback zu nutzen, um erst einmal alle anderen Properties zu setzen. So ein Property gibt es aber leider nicht.