2009-08-19 13 views
8

aufgerufen wird Ich erstelle ein WPF-CustomControl, das eine Abhängigkeitseigenschaft mit PropertyChangedCallback hat. In dieser Callback-Methode versuche ich, Werte für einige der Teile des Steuerelements, die ich von OnApplyMethod mithilfe der GetTemplateChild() -Methode abrufen, festzulegen.WPF CustomControl: OnApplyTemplate, das nach PropertyChangedCallback

Das Problem ist, dass der PropertyChangedCallback (auf einigen Systemen) vor OnApplyTemplate aufgerufen wird, so dass die Steuerelementteile immer noch null sind.

Die Problemumgehung, die ich derzeit verwende, besteht darin, e.NewValue aus dem PropertyChangedCallback in eine Mitgliedsvariable zu speichern und anschließend SetValue (dp, _savedValue) in OnApplyTemplate() aufzurufen.

Was ist der richtige Weg, um mit diesem Problem umzugehen, oder verwende ich bereits die beste Lösung?

+2

Nicht sicher, warum jemand deine Frage noch nicht beantwortet hat, aber ich kann sagen, dass ich ziemlich dasselbe mache wie du und bis jetzt scheint es im Allgemeinen zu funktionieren. Ich habe kürzlich in einer SplitButton-Implementierung auf ein bestimmtes Problem gestoßen, bei dem das erste ausgewählte Element nicht angezeigt wird, aber nach der manuellen Auswahl eines Elements. – jpierson

Antwort

7

das ist, was wir tun - löst nicht das Problem im Prinzip, sondern bietet einen klaren Weg, es zu beheben.

  1. Erstellen Sie einen Handler für den Wert DP geändert Ereignis, lassen Sie es OnValueChanged(). In der Regel keine Paramter wie Sie wissen benötigt, die DP geändert wird und der aktuelle Wert immer erhalten.

  2. Erstellen Sie eine Klasse/Struktur namens DeferedAction mit dem Konstruktor und akzeptieren Sie System.Action (das ist ein Verweis auf Ihre OnValueChanged()). Die Klasse wird eine Eigenschaft Action und eine Methode namens Execute() haben.

Hier ist, was ich benutze:

class DeferredAction 
{ 
    private Action action; 

    public DeferredAction(Action action) 
    { 
     this.action = action; 
    } 

    private Action Action 
    { 
     get { return this.action; } 
    } 

    public void Execute() 
    { 
     this.Action.Invoke(); 
    } 
} 
  1. In Ihrer Kontrolle eine Liste erstellen. Die Auflistung behält die Liste der DeferredActions bei, bis sie erfolgreich angewendet werden können (normalerweise nach base.OnApplyTemplate()). Sobald Aktionen angewendet werden, muss die Sammlung gelöscht werden, um eine doppelte Verarbeitung zu vermeiden.

  2. Überprüfen Sie in OnValueChanged, ob Ihre Teile nicht null sind (was wahrscheinlich ist), und fügen Sie in diesem Fall eine neue Instanz von DeferredAction (OnValueChanged() zur Liste hinzu, die in einem vorherigen Schritt erstellt wurde.) OnValueChanged () ist ein Dual Purpose Handler, der direkt von Ihrem DP - Wert - geänderten Handler aufgerufen werden kann, wenn Parts nicht null sind, alternativ wird es als ausführbare Aktion mit ausführbarer Funktion verwendet wissen, wenn sie da sind, wurden sie nicht angewendet) und für jeden von ihnen Execute aufrufen. Löschen Sie die Liste am Ende.

Prost

Verwandte Themen