Что делает флаг PathGeneratedInternally в привязке WPF? - PullRequest
5 голосов
/ 17 августа 2010

Я только что ответил на вопрос здесь , где я сказал, что нет никакой функциональной разницы между

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

Я уверен, что все это довольно несущественно, но кто-нибудь там знает, что этофлаг означает, и почему он может отличаться в зависимости от того, как вы объявляете привязку?

1 Ответ

4 голосов
/ 09 марта 2011

Ключ должен видеть, откуда вызывается метод UsePath.По умолчанию флаг не будет установлен, поэтому его очистка в основном не работает.Нет смысла очищать его в конструкторе, потому что вы знаете, что он не был установлен в этом случае (потому что объект все еще создается).

Метод UsePath вызывается только в одном месте, и этоконструктор ClrBindingWorker.Если вы загляните туда, то увидите, что они автоматически создают «пустой» или «пустой» путь и передают его в UsePath.

Я подозреваю, что они делают это, поэтому путь «действителен» при внутреннем использовании, даже еслиэто просто относится к источнику привязки (который является поведением по умолчанию, когда путь не указан).Если позднее вы установите свойство Path в Binding, флаг, указывающий, что Path был автоматически создан, должен быть очищен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...