2010-08-17 17 views
5

Ho appena risposto a una domanda over here dove ho detto che non v'è alcuna differenza funzionale traCosa fa il flag PathGeneratedInternally in un binding WPF?

e

{Binding Path=TargetProperty} 

e, per quanto a mia conoscenza quello che ho scritto è fondamentalmente corretta. Tuttavia l'idea che si utilizzerà il costruttore e l'altro imposta la proprietà mi ha fatto pensare che ci potrebbe essere una differenza, quindi ho aperto il riflettore aperto e ho dato un'occhiata.

Il costruttore ha il seguente codice in esso:

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 proprietà percorso è questo:

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

Così, quando si imposta il percorso attraverso la proprietà la bandiera PathGeneratedInternally viene cancellato. Ora, questo flag non è esposto da nessuna parte direttamente al pubblico, ma sembra per essere utilizzato in alcuni posti:

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)); 
} 

Sono sicuro che è tutto abbastanza irrilevante, ma qualcuno là fuori sa che cosa questo significa bandiera e perché potrebbe essere diverso a seconda di come si dichiara l'associazione?

risposta

4

La chiave è vedere da dove fa riferimento il metodo UsePath. Di default il flag non verrà impostato, quindi cancellarlo è fondamentalmente un no-op. Non c'è motivo di cancellarlo nel costruttore, perché sai che non è stato impostato in quel caso (perché l'oggetto è ancora in costruzione).

Il metodo UsePath viene chiamato solo in una posizione ed è il costruttore ClrBindingWorker. Se guardi lì, vedrai che creano automaticamente un percorso "vuoto" o "vuoto" e lo passano a UsePath.

Sospetto che lo facciano in modo che il percorso sia "valido" se utilizzato internamente, anche se si riferisce solo all'origine dell'associazione (che è il comportamento predefinito quando non viene fornito alcun percorso). Se in seguito si imposta la proprietà Path sul Binding, il flag che indica che il Path è stato generato automaticamente deve essere cancellato.

+0

Quindi c'è una differenza funzionale? –

+0

@ UriAbramson - No – CodeNaked