2010-08-17 11 views
5

he acaba de responder una pregunta over here donde dije que no hay diferencia funcional entre¿Qué hace el indicador PathGeneratedInternally en un enlace WPF?

y

{Binding Path=TargetProperty} 

y, por lo que yo soy consciente de lo que he escrito es fundamentalmente correcto. Sin embargo, la idea de que uno use el constructor y el otro establece la propiedad me hizo pensar que hay podría ser, así que abrí el reflector y eché un vistazo.

El constructor tiene el siguiente código en él:

public Binding(string path) 
{ 
    this._source = UnsetSource; 
    if (path != null) 
    { 
     if (Dispatcher.CurrentDispatcher == null) 
     { 
      throw new InvalidOperationException(); 
     } 
     this._ppath = new PropertyPath(path, new object[0]); 
     this._attachedPropertiesInPath = -1; 
    } 
} 

La propiedad ruta es la siguiente:

public PropertyPath Path 
{ 
    get 
    { 
     return this._ppath; 
    } 
    set 
    { 
     base.CheckSealed(); 
     this._ppath = value; 
     this._attachedPropertiesInPath = -1; 
     base.ClearFlag(BindingBase.BindingFlags.PathGeneratedInternally); 
    } 
} 

Así que cuando se establece el camino a través de la propiedad de la bandera PathGeneratedInternally se borra. Ahora, esta bandera no está expuesto públicamente en cualquier lugar directamente, pero sí parece que se utilizará en algunos lugares:

internal void UsePath(PropertyPath path) 
{ 
    this._ppath = path; 
    base.SetFlag(BindingBase.BindingFlags.PathGeneratedInternally); 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public bool ShouldSerializePath() 
{ 
    return ((this._ppath != null) && !base.TestFlag(BindingBase.BindingFlags.PathGeneratedInternally)); 
} 

Estoy seguro de que todo bastante intrascendente, pero ¿alguien por ahí sabe lo que esto significa bandera y por qué tal vez sea diferente dependiendo de cómo declaras el enlace?

Respuesta

4

La clave es ver de dónde se hace referencia al método UsePath. Por defecto, la bandera no se establecerá, por lo que borrarla es básicamente una operación no operativa. No hay ninguna razón para borrarlo en el constructor, porque sabe que no se ha establecido en ese caso (porque el objeto aún se está construyendo).

El método UsePath solo se invoca en una ubicación y es el constructor ClrBindingWorker. Si miras allí, verás que crean automáticamente una ruta "en blanco" o "vacía" y la pasan a UsePath.

Sospecho que hacen esto, por lo que la ruta es "válida" cuando se usa internamente, incluso si solo se refiere a la fuente de enlace (que es el comportamiento predeterminado cuando no se da ninguna ruta). Si más tarde configura la propiedad Path en el enlace, se debe borrar el indicador que indica que la ruta se generó automáticamente.

+0

Entonces, ¿hay una diferencia funcional? –

+0

@UriAbramson - Nope – CodeNaked

Cuestiones relacionadas