Я пытаюсь выяснить, каковы точно Свойства Зависимости, но когда я где угодно ищу определение, я только нахожу, "как использовать", но не, "каково это". Предположите, что Вас спрашивают относительно собеседования - что такое свойство зависимости. Каков был бы Ваш ответ?
DependencyProperty - это свойство, значение которого зависит (или может зависеть) от какого-либо другого источника (например, анимации, привязки данных, стилей или наследования визуального дерева) . Значение обычного свойства хранится в объекте, которому оно принадлежит, в то время как вы можете думать о свойстве зависимости как о хранящемся где-то в базе данных. Эта база данных по существу состоит из словаря, который отображает пары (объект, свойство) на их значения, а также отображает, какие свойства зависят от других свойств (например, когда вы изменяете DataContext в Panel, он может уведомить всех детей внутри панели).
Так почему они где-то хранят значения свойств в какой-то волшебной базе данных? На это есть несколько причин:
Это уменьшает пространство для хранения. Добавление свойства (даже если его значение равно нулю) в класс добавляет 4 байта (8 для 64-битного процесса) пространства для каждого экземпляра класса. DependencyProperty занимает место только тогда, когда у экземпляра есть значение. Например, FrameworkElement имеет множество свойств зависимостей, большинству из которых никогда не присваиваются значения. Если бы все эти свойства были сохранены в классе, каждый экземпляр занимал бы сотни байтов. Вместо этого каждый экземпляр занимает всего около 40 байт.
Включает присоединенные свойства. Такие свойства, как Canvas.Left
и Grid.Row
, должны храниться в объектах, которые никогда не слышали о Canvas
или Grid
, поэтому куда вы их положите? Вы помещаете их куда-нибудь в базу данных.
Позволяет автоматически изменять свойства.Представьте, как бы вы реализовали что-то вроде наследования стилей или свойств (возможность установить что-то вроде шрифта или контекста данных для родительского элемента и распространить его значение на все дочерние элементы).Хранение всего этого в базе данных позволяет хранить весь код в одном месте вместо того, чтобы реализовывать его отдельно для каждого объекта и свойства, которые в нем нуждаются.
Свойство зависимости - это свойство, которое поддерживается системой свойств WPF, а не полем в объявляющем классе.
Значение этого заключается в том, что, поскольку WPF владеет свойством, WPF может учитывать различные факторы при вычислении значения свойства, такие как анимация, стили и привязки данных. Другое следствие заключается в том, что, поскольку свойства управляются WPF, их не нужно объявлять в классах, которые концептуально имеют состояние: следовательно, присоединенные свойства, которые позволяют, например, Сетка, чтобы связать специфичное для грида состояние с объектами, не относящимися к сетке.
(Кстати, я упомянул WPF выше, потому что это основная структура, использующая DP, но Windows Workflow Foundation также имеет понятие свойств зависимостей. Итак, чтобы быть точным, DP - это свойство, поддерживаемое внешняя система свойств, в частности такая, которая позволяет использовать факторы, отличные от «последнего установленного значения», при получении значения свойства.)
MSDN предоставляет хорошее определение, описание и примеры
Для более глубокого понимания проверки DependencyProperty здесь
"дает вам набор инфраструктуры, чтобы делать все, что вы часто хотите работать с обычным свойством - проверять его, приводить к правильному диапазону, выдавать уведомления об изменениях и ряд других аспектов ».
Зависимое свойство - это свойство, текущее значение которого зависит (отсюда и название) от других аспектов, таких как значения по умолчанию, валидация, принуждение, наследование значений или анимация.
Также зависимое свойство имеет встроенную поддержку уведомлений об изменениях, привязки данных и стилизации.
Что это такое?
Набор классов и определенных способов их использования, которые обеспечивают вышеупомянутую функциональность для использования в классах, наследующих от DependencyObject.
Они не являются особенностью языка. Они являются особенностью .NET Framework.