2010-08-17 10 views
5

Ich habe geantwortet nur eine Frage over here, wo ich sagte, dass es zwischenWas bewirkt das PathGeneratedInternal-Flag in einer WPF-Bindung?

und

keinen funktionalen Unterschied
{Binding Path=TargetProperty} 

und, soweit mir bekannt ist, was ich geschrieben habe, ist im Grunde richtig. Aber die Idee, dass man den Konstruktor benutzt und der andere setzt die Eigenschaft, hat mich dazu gebracht zu denken, dass ein Unterschied sein könnte, also habe ich den offenen Reflektor gepeitscht und einen Blick darauf geworfen.

Der Konstruktor hat den folgenden Code in es:

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

Der Pfad Eigenschaft ist dies:

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

Also, wenn Sie den Weg durch die Eigenschaft der PathGeneratedInternally-Flag gesetzt wird gelöscht. Nun wird dieser Flag nicht überall öffentlich direkt ausgesetzt, aber es scheint an einigen Stellen verwendet werden:

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

Ich bin sicher, es ist alles ziemlich belanglos, aber hat jemand da draußen weiß, was dieses Flag Mittel und warum kann es je nachdem, wie du die Bindung deklarierst, anders sein?

Antwort

4

Der Schlüssel ist zu sehen, wo die UsePath-Methode referenziert wird. Standardmäßig wird das Flag nicht gesetzt, daher ist das Löschen im Grunde ein No-Op. Es gibt keinen Grund, es im Konstruktor zu löschen, weil Sie wissen, dass es in diesem Fall nicht festgelegt wurde (weil das Objekt noch erstellt wird).

Die UsePath-Methode wird nur an einer Stelle aufgerufen, und das ist der ClrBindingWorker-Konstruktor. Wenn Sie dort hineinschauen, sehen Sie, dass sie automatisch einen "leeren" oder "leeren" Pfad erstellen und diesen an UsePath übergeben.

Ich vermute, dass sie dies tun, so dass der Pfad "gültig" ist, wenn intern verwendet, auch wenn es sich nur auf die Bindungsquelle bezieht (das ist das Standardverhalten, wenn kein Pfad angegeben ist). Wenn Sie später die Path-Eigenschaft für die Bindung festlegen, muss das Flag, das angibt, dass der Pfad automatisch generiert wurde, gelöscht werden.

+0

Gibt es also einen funktionalen Unterschied? –

+0

@UriAbramson - Nein – CodeNaked

Verwandte Themen