2016-07-12 3 views
-2

Зависимость свойства статична по своему характеру, поэтому, если я создаю свойство пользовательской зависимости типа bool, называемое «IsGrayProperty», и реализую его на двух кнопках. Тогда, если я установить значение в btn1, почему это не должно быть отражено в btn2, как DependencyProperty статична и их обертка свойство .net «IsGray»Механизм зависимости Dependency

+0

Поскольку btn2 не ссылается на атрибут btn1. – Adam

ответ

0

Статическая DependencyProperty имени чтения IsGrayProperty является идентификатором - ключевое значение, так сказать. Он также содержит метаданные об этом свойстве. Это не фактическое свойство. Каждый экземпляр DependencyObject хранит собственные значения DependencyProperty.

свойства зависимостей являются семантически очень как обычные свойства экземпляра, но у них есть дополнительные функции, которые позволяют им делать то, что обычные свойства экземпляра не может (например, вы можете изменить их метаданные во время выполнения, в отличие от Attributes на регулярной свойства, и вы можете создавать прикрепленные свойства). Вот почему они существуют.

Например, TextBlock.Text является зависимым имуществом.

// 
// Summary: 
//  Identifies the System.Windows.Controls.TextBlock.Text dependency property. 
// 
// Returns: 
//  The identifier of the System.Windows.Controls.TextBlock.Text dependency property. 
[CommonDependencyProperty] 
public static readonly DependencyProperty TextProperty; 

И у него есть «обычное свойство» обертка, тоже:

// 
// Summary: 
//  Gets or sets the text contents of a System.Windows.Controls.TextBlock. 
// 
// Returns: 
//  The text contents of this System.Windows.Controls.TextBlock. Note that all 
//  non-text content is stripped out, resulting in a plain text representation 
//  of the System.Windows.Controls.TextBlock contents. The default is System.String.Empty. 
[Localizability(LocalizationCategory.Text)] 
public string Text { get; set; } 

Когда вы устанавливаете Text одного TextBlock, делает каждую другой TextBlock АКЦИИ же текст? Нет, конечно нет. И если бы они это сделали, свойства зависимостей были бы совершенно бесполезны.

Параметр DependencyProperty - GetValue сообщает DependencyObject значение, которое извлекается из собственного внутреннего хранилища свойств объекта зависимостей; если значение было сохранено в самом DependencyProperty, вы будете запрашивать DependencyProperty, неDependencyObject.

public void ForExample(TextBlock tb) 
{ 
    var oldtext = tb.GetValue(TextBlock.TextProperty) as String; 

    tb.SetValue(TextBlock.TextProperty, "Test value"); 
} 

Если есть только один глобальное значение для TextBlock.TextProperty, и она хранится в TextBlock.TextProperty, почему на земле мы призывая GetValue() и SetValue() на некотором случайном экземпляре TextBlock? Зачем вообще вводить конкретный экземпляр TextBlock?

Вместо этого мы будем звонить TextBlock.TextProperty.SetValue().

Это так же, как словарь:

var d1 = new Dictionary<String, Object>(); 
var d2 = new Dictionary<String, Object>(); 
var keyValue = "Foo"; 

d1.Add(keyValue, 32); 

Console.WriteLine(d2[keyValue]); 

Что можно ожидать от d2[keyValue]? Вы ожидали бы ничего, потому что вы никогда не давали d2 значение для keyValue. d1.Add("Foo",32) не сохраняет целое число 32 в строке "Foo". Он хранит его в в словаре.

В каждом словаре хранятся собственные значения ключа. Каждый DependencyObject сохраняет свои собственные значения свойств. Внутри он, вероятно, хранит их в a Dictionary; почему нет? Если.Команда NET могла написать более эффективный способ хранения пар ключ/значение, чем Dictionary, они бы назвали его Dictionary.

Если у вас есть представление о том, что означает язык или фреймворк, всегда спрашивайте себя: «Если бы моя идея была правдой, функция была бы абсолютно бесполезной или массово вредной?» Если ответ на этот вопрос «да», то вы неправильно поняли, что означает функция. Это на 100% гарантировано, потому что разработчики и разработчики языка и рамок не привыкли тратить месяцы усилий на разработку функций, которые абсолютно бесполезны (classes in Perl 5 come close, though).

+0

Спасибо Ed, да, вы правы, но не получили, как статическое свойство может иметь разные значения для разных элементов управления, хотя GetValue, Setvalue в конце доступа к статическому свойству readonly. – Raj

+0

Это точно эквивалентно извлечению элементов из словаря: ' var foo = new Словарь ();/* добавить материал */var x = foo ["Bar"]; '. Если у вас есть шесть разных словарей, каждый хранит свое личное значение для «Бар». Параметр 'DependencyProperty' для' GetValue' сообщает 'DependencyObject', значение которого извлекается из собственного внутреннего хранилища; если значение хранилось в 'DependencyProperty', вы бы запросили' DependencyProperty', * not * the DependencyObject'. –

0

Что действительно статично, является зависимость свойство дескриптора:

public static readonly DependencyProperty IsGrayProperty =  
    DependencyProperty.Register(
     "IsGray", 
     typeof(bool), 
     typeof(MyButton)); 

Дескриптор содержит только метаданные о собственности, и она не содержит его значение.

Фактическое свойство, которое используется при связывании данных и доступ к ним из кода, является экземпляр один:

public bool IsGray 
{ 
    get 
    { 
     return (bool)GetValue(IsGrayProperty); 
    } 
    set 
    { 
     SetValue(IsGrayProperty, value); 
    } 
} 

, как вы можете видеть, он делегирует получить и установить на методы экземпляра GetValue и SetValue базы DependencyObject.

Внутренний, DependencyObject поддерживает массив записей (в поле экземпляра), где хранятся фактические значения его свойств зависимостей. Каждый экземпляр имеет свой собственный массив, а фактическое значение находится в одной из записей. Таким образом, он никогда не делится с другими экземплярами. Таким образом, SetValue изменяет состояние текущего экземпляра кнопки, а не какое-либо статическое состояние.

Статический IsGrayProperty дескриптор используется только для определения индекса в массиве ввода, выполнить проверку на корректность и т.д. Тот факт, что IsGrayProperty статична, делает несколько анти-интуитивным думать, но, тем не менее, значения свойств зависимостей являются в экземпляр объекта зависимости и не используются совместно.

+0

Благодаря Felix, используя GetValue и SetValue, я обращаюсь к зарегистрированному статическому IsGrayproperty, в этом случае статическое свойство будет иметь только одно значение за раз, поэтому оно должно быть одинаковым для всего реализованного элемента управления, но это не так, t, я хочу знать, как работает свойство зависимостей – Raj

+0

Нет, нет, нет. Используя GetValue и SetValue, вы получаете доступ к полю экземпляра, который содержит массив записей, частный для каждого экземпляра. Дескриптор IsGrayProperty используется только для определения индекса в массиве, выполнения проверок и т. Д. Фактическое значение, считанное и написанное GetValue и SetValue, находится в записи в массиве записей, и каждый экземпляр имеет свой собственный массив записей. Тот факт, что IsGrayProperty статичен, делает его несколько антиинтуитивным, чтобы думать об этом, но, тем не менее, значения свойств зависимостей относятся к одному экземпляру и не используются совместно. –