Зависимость свойства статична по своему характеру, поэтому, если я создаю свойство пользовательской зависимости типа bool, называемое «IsGrayProperty», и реализую его на двух кнопках. Тогда, если я установить значение в btn1, почему это не должно быть отражено в btn2, как DependencyProperty статична и их обертка свойство .net «IsGray»Механизм зависимости Dependency
ответ
Статическая 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).
Спасибо Ed, да, вы правы, но не получили, как статическое свойство может иметь разные значения для разных элементов управления, хотя GetValue, Setvalue в конце доступа к статическому свойству readonly. – Raj
Это точно эквивалентно извлечению элементов из словаря: ' var foo = new Словарь
Что действительно статично, является зависимость свойство дескриптора:
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
статична, делает несколько анти-интуитивным думать, но, тем не менее, значения свойств зависимостей являются в экземпляр объекта зависимости и не используются совместно.
Благодаря Felix, используя GetValue и SetValue, я обращаюсь к зарегистрированному статическому IsGrayproperty, в этом случае статическое свойство будет иметь только одно значение за раз, поэтому оно должно быть одинаковым для всего реализованного элемента управления, но это не так, t, я хочу знать, как работает свойство зависимостей – Raj
Нет, нет, нет. Используя GetValue и SetValue, вы получаете доступ к полю экземпляра, который содержит массив записей, частный для каждого экземпляра. Дескриптор IsGrayProperty используется только для определения индекса в массиве, выполнения проверок и т. Д. Фактическое значение, считанное и написанное GetValue и SetValue, находится в записи в массиве записей, и каждый экземпляр имеет свой собственный массив записей. Тот факт, что IsGrayProperty статичен, делает его несколько антиинтуитивным, чтобы думать об этом, но, тем не менее, значения свойств зависимостей относятся к одному экземпляру и не используются совместно. –
Поскольку btn2 не ссылается на атрибут btn1. – Adam