Я только что ответил на вопрос здесь , где я сказал, что нет никакой функциональной разницы между
{Binding TargetProperty}
и
{Binding Path=TargetProperty}
и, какНасколько я знаю, то, что я написал, в корне верно.Однако мысль о том, что один будет использовать конструктор, а другое устанавливает свойство, заставила меня задуматься о том, что может быть разницей, поэтому я открыл отражатель и посмотрел.
Конструктор имеетв нем следующий код:
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;
}
}
Свойство path имеет следующий вид:
public PropertyPath Path
{
get
{
return this._ppath;
}
set
{
base.CheckSealed();
this._ppath = value;
this._attachedPropertiesInPath = -1;
base.ClearFlag(BindingBase.BindingFlags.PathGeneratedInternally);
}
}
Поэтому при установке пути через свойство флаг PathGeneratedInternally сбрасывается.Теперь этот флаг нигде публично не раскрывается, но кажется, что он используется в нескольких местах:
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));
}
Я уверен, что все это довольно несущественно, но кто-нибудь там знает, что этофлаг означает, и почему он может отличаться в зависимости от того, как вы объявляете привязку?