2009-08-19 12 views
8

Estoy creando un WPF CustomControl que tiene una propiedad de dependencia con PropertyChangedCallback. En ese método de devolución de llamada, intento establecer valores en algunas de las partes del control que recupero de OnApplyMethod utilizando el método GetTemplateChild().WPF CustomControl: OnApplyTemplate llamado después de PropertyChangedCallback

El problema es que PropertyChangedCallback es (en algunos sistemas) llamado antes de OnApplyTemplate para que las partes de control sigan siendo nulas.

La solución provisional que estoy usando actualmente es guardar e.NewValue de PropertyChangedCallback en una variable miembro y luego llamar a SetValue (dp, _savedValue) en OnApplyTemplate().

¿Cuál es la forma correcta de tratar este problema o ya estoy usando la mejor solución?

+2

No estoy seguro de por qué alguien aún no ha respondido su pregunta, pero puedo decir que estoy haciendo lo mismo que usted y, hasta ahora, parece que funciona. Me he encontrado recientemente con un problema en particular en una implementación de SplitButton que hace esto cuando el primer elemento seleccionado no aparece pero después de seleccionar manualmente un elemento lo hace. – jpierson

Respuesta

7

eso es lo que hacemos, no resuelve el problema en principio, pero proporciona una manera clara de solucionarlo.

  1. crear un controlador para el evento cambiado el valor DP, que sea OnValueChanged(). En general, no parametros necesarios como saben los que se cambia DP y siempre puede obtener su valor actual.

  2. Crea una clase/estructura llamada DeferredAction con el constructor, aceptando System.Action (que será una referencia a OnValueChanged()). La clase tendrá una propiedad Acción y un método, llamado Execute().

Esto es lo que yo uso:

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. En su mando a crear una lista. La colección mantendrá la lista de DeferredAction hasta que puedan aplicarse con éxito (generalmente después de base.OnApplyTemplate()). Una vez que se aplican las acciones, la colección debe borrarse para evitar el doble procesamiento.

  2. Dentro de OnValueChanged compruebe si su (s) Parte (s) no es nula (lo que es probable) y, de ser así, agregue una nueva instancia de DeferredAction (OnValueChanged() a la lista creada en un paso anterior. Nota, OnValueChanged () es un controlador de doble propósito que se puede llamar directamente desde su controlador de cambio de valor DP, si las partes no son nulas, alternativamente se utiliza como una acción diferida ejecutable.

  3. Dentro de usted OnApplyPremio de plantilla a través de su lista de acciones diferidas (saber, si están allí, no se han aplicado) y llamar a ejecutar para cada uno de ellos. Borrar la lista al final.

Cheers

Cuestiones relacionadas