Как WPF DependencyProperty подбирает ключ, чтобы различать каждый экземпляр объекта и искать значения DependencyProperty?

В Google много статей, в которых говорится, что DependencyProperty является статическим, потому что в нем есть механизм KeyValue для поддержания значения каждого экземпляра объекта.

Но проблема в том, что если мы вызываем GetValue / SetValue для DependencyProperty, как он идентифицирует каждый экземпляр и генерирует ключ, чтобы считывать / сохранять значения из HashTable для другого экземпляра объекта?

Например: если мы создаем 2 экземпляра TestDp, а затем устанавливаем значение для TestDProperty обоих экземпляров, как SetValue идентифицирует каждый экземпляр и соответственно сохраняет значение DependencyProperty в хеш-таблицу?

Я проверил код для GetValue и SetValue из DependencyObject, но я все еще не могу понять, как он различает каждый экземпляр. Код this.LookupEntry(dp.GlobalIndex) подхватывает EntryIndex, но я не уверен, как генерируется GlobalIndex для различения каждого экземпляра объекта.

 public class TestDp : DependencyObject
    {
        protected static DependencyProperty dpTest = DependencyProperty.Register("TestDProperty", typeof(string), typeof(TestDp));
        public string TestDProperty
        {
            get
            {
                var r = (string)GetValue(dpTest);
                return r;
            }
            set
            {
                SetValue(dpTest, value);
            }
        }
    }

2 ответа

Решение

GetValue объекта DependencyObject будет вызывать GetValueEntry и использовать EntryIndex, который вы упомянули. Однако, похоже, что он не генерирует никаких ключей на основе информации об экземпляре.

Используемые сокращения:

ДП = DependencyProperty

dp# = экземпляры DP, например, DP1

ДЕЛАТЬ = DependencyObject

dp# =экземпляры DO

Хороший хороший вопрос, но я не думаю, что принятый ответ и комментарии действительно получили то, о чем вы спрашиваете, как жаль. Более ясный вопрос может быть:

Как экземпляр DependencyObject хранит свои локальные свойства DependencyProperty и извлекает их (их) с помощью GetValueа также ?

Согласно вашему описанию, вы находитесь на пути написания, чтобы исследовать путь, что вам нужно сделать, так это немного отследить исходный код:

ЗависимостьОбъект.SetValue

ЗависимостьОбъект.GetValue

Прежде чем углубляться в детали, имейте в виду, что одним из преимуществ, предлагаемых механизмом зависимостей, является помощь в . Так что можно примерно представить, как это работает: в самом начале у каждого экземпляра DO ноль локальных DP; и как только он установил локальный DP, вызвав соответствующий SetValue, он выделяет место в памяти для его хранения. Хотя описание далеко от истины, по крайней мере, оно дает вам предварительное представление.

DependencyProperty

Во-первых, давайте сосредоточимся на DP. Как мы знаем, каждый экземпляр DP будет зарегистрирован только один раз , а DP имеет приватное статическое поле int GlobalIndexCount, который увеличивается на 1 каждый раз, когда регистрируется новый экземпляр DP. Соответственно, каждый экземпляр DP имеет , возможный пример может быть таким:

Все EffectiveValueEntryхранятся в сортируются по

Ключевой момент

Теперь дело доходит до сути вашей головоломки : когда экземпляр DO пытается получить DP, он использует DP. GlobalIndexдля поиска его частного поля, если оно найдено, возвращается локальное значение DP; в противном случае возвращается значение по умолчанию или унаследованное значение. На самом деле реальная история гораздо сложнее, см . уменьшении объема памятиСтратегия разрешения стоимости.

Когда дело доходит до записи вместо чтения , происходят похожие истории, только не чтение, а изменение _effectiveValues.

Другие вопросы по тегам