2014-11-04 1 views
0

Из google в многочисленных статьях говорится, что DependencyProperty является статическим, поскольку он имеет механизм KeyValue для поддержания значения каждого экземпляра объекта.Как WPF DependencyProperty захватывает ключ, чтобы различать каждый экземпляр объекта и искать значения DependencyProperty?

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

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

Я проверил код для GetValue & SetValue of 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); 
      } 
     } 
    } 
+0

Не уверен, что я понимаю ваш вопрос, но вы вызываете 'GetValue' /' SetValue' в текущем экземпляре 'DependencyObject'. Также 'dpTest' должен быть назван' TestDProperty', а оболочка CLR должна называться 'TestD' и имя зарегистрированного свойства _" TestD "_ – dkozl

+0

*** установить значение для TestDProperty обоих экземпляров ***, когда вы это сделаете, вы конечно, нужно вызвать 'SetValue' на *** разных экземплярах ***, поэтому он знает, где сохранить данные отдельно. Обратите внимание, что данные разделяются только тогда, когда они имеют значение *** *** ***, как только они меняются для определенного экземпляра, они больше не будут использоваться совместно. –

+0

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

ответ

1

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

+2

Правильно, для каждого DP создается только глобальный индекс, сгенерированный во время регистрации свойства. Это служит «ключом». Экземпляра не существует. –

Смежные вопросы