Как 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
а также ?
Согласно вашему описанию, вы находитесь на пути написания, чтобы исследовать путь, что вам нужно сделать, так это немного отследить исходный код:
Прежде чем углубляться в детали, имейте в виду, что одним из преимуществ, предлагаемых механизмом зависимостей, является помощь в . Так что можно примерно представить, как это работает: в самом начале у каждого экземпляра DO ноль локальных DP; и как только он установил локальный DP, вызвав соответствующий
SetValue
, он выделяет место в памяти для его хранения. Хотя описание далеко от истины, по крайней мере, оно дает вам предварительное представление.
DependencyProperty
Во-первых, давайте сосредоточимся на DP. Как мы знаем, каждый экземпляр DP будет зарегистрирован только один раз , а DP имеет приватное статическое поле
int GlobalIndexCount
, который увеличивается на 1 каждый раз, когда регистрируется новый экземпляр DP. Соответственно, каждый экземпляр DP имеет , возможный пример может быть таким:
Все
EffectiveValueEntry
хранятся в сортируются по
Ключевой момент
Теперь дело доходит до сути вашей головоломки : когда экземпляр DO пытается получить DP, он использует DP.
GlobalIndex
для поиска его частного поля, если оно найдено, возвращается локальное значение DP; в противном случае возвращается значение по умолчанию или унаследованное значение. На самом деле реальная история гораздо сложнее, см . уменьшении объема памятиСтратегия разрешения стоимости.
Когда дело доходит до записи вместо чтения , происходят похожие истории, только не чтение, а изменение
_effectiveValues
.