Что такое свойство зависимостей?

Что такое свойство зависимостей в .Net(особенно в контексте WPF). В чем отличие от обычного свойства?

4b9b3361

Свойства зависимостей - это свойства классов, которые происходят из DependencyObject, и они специально для них, а не просто используют поле поддержки для хранения их значения, они используют некоторые вспомогательные методы в DependencyObject.

Самое приятное в том, что у них есть вся сантехника для встроенного связывания данных. Если вы привязываете к ним что-то, они будут уведомлять об этом, когда они меняются.

86
ответ дан 06 марта '09 в 3:43
источник

Единственное объяснение, которое я нашел полезным и хорошо написано, это следующее: http://www.wpftutorial.net/dependencyproperties.html

В основном, DependencyProperties отличаются от обычных свойств тем, что они не просто сеттеры/получатели для полей в классе, но они динамически извлекают свои фактические значения во время выполнения. Метод SetValue() для DP очень прост и устанавливает локальное значение свойства в значение, которое вы ему дали. Однако, когда вы пытаетесь выполнить GetValue() из DependencyProperty, сначала будет искать локальное значение, если оно отсутствует (что является жизнеспособным в DependencyProperties, в отличие от обычных свойств), оно продолжит логическое дерево пользовательского интерфейса, пока оно не найдет такое значение, Если структура достигла вершины дерева без нахождения каких-либо локальных значений, в качестве значения свойства будет использоваться предопределенное значение по умолчанию.

Этот метод позволяет DependencyProperties потреблять меньше памяти, чем обычные, поскольку только значения, которые явно заданы пользователем, будут храниться локально.

И, как уже упоминалось выше, DependencyProperties также позволяют нам связываться с ними в коде XAML и устанавливать на них триггеры, которые по регулярным свойствам не разрешены.

Надеюсь, мне удалось устранить некоторые неопределенности:)

78
ответ дан 16 окт. '12 в 19:02
источник

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/ дает хорошее объяснение свойств зависимостей как в контексте WF, так и в WPF.

Выдержка:

Ключевая точка - разрешены значения свойств зависимостей

Конечной целью свойства зависимостей, как и любого свойства, является управление состоянием. Но, в отличие от обычных .Net-свойств, значение локального свойства не сохраняется в переменной экземпляра.

Вместо этого свойства зависимостей регистрируются в структуре свойств зависимостей, и значение базового свойства разрешается - это означает, что значение определяется структурой свойств зависимостей на основе правил, определенных регистрацией свойств.

35
ответ дан 06 марта '09 в 3:40
источник

Объяснение без кода

Подумайте об этом так:

Все более или менее одинаковые

Люди имеют много информации, связанной с ними. С вами связано несколько тысяч и тысячи данных - сколько пальцев у вас есть, сколько пальцев, сколько генов BRCA2 у вас есть и т.д.

Теперь возникает проблема: кто-то может задать вам эти вопросы в любой момент, и вы сможете дать им прямой ответ.

Итак, вопрос: как вы можете все это помнить? Ну, изначально люди начали писать все это, но вскоре они поняли, что им нужно будет нести всю библиотеку Александрии в их заднем кармане, чтобы иметь возможность ответить на все эти вопросы: это слишком много вещей, чтобы обхватить.

Хранить общую информацию в одном месте

У кого-то была яркая идея. Они заметили, что большую часть времени информация такая же. Большинство людей имеют одни и те же данные и очень редко меняются. У большинства людей есть:

  • одно сердце
  • одно лицо и т.д.
  • три гена BRCA2

Для каждого отдельного человека нет необходимости носить эту информацию. Вы можете хранить всю эту информацию в одном месте, в одной центральной библиотеке. Но всегда есть исключения......... если у вас есть какие-то исключения, то вы просто несете эти исключения с собой в заднем кармане. По большей части люди очень похожи - они разделяют одни и те же ценности, и это редко меняется. Если у вас нет исключения, вы можете просто отправить интервьюера к данным, хранящимся в общем репозитории.

Пример: Репортер беседует с президентом Дональдом Трампом **

Давайте попробуем это с примером.

У нас есть экземпляр Person: Donald Trump. Репортер новостей задает нашему уважаемому президенту несколько вопросов:

"Господин Президент Трамп, сколько у вас генов HIF1A?"

Дональд проверяет свой задний карман. Там ничего не указано, сколько у него генов. Поэтому он просто сообщает репортеру, что у него есть номер по умолчанию, который есть у всех остальных. Поэтому репортер просто идет в библиотеку, чтобы узнать об этой детали.

"Господин Президент Трамп, сколько у вас лиц?

"Извините!" говорит Дональд Трамп с резким ударом пальца - он затем достигает в своем заднем кармане, чтобы проверить, что там написано - может ли это значение разрешиться локально? Если это он, он может просто вернуть значение, записанное в его заднем кармане, но если ничего не существует, он может просто направлять отчет, чтобы перейти в локальную библиотеку, чтобы найти эту информацию. Но есть значение, записанное локально - в его заднем кармане есть ответ: у него есть 2 лица. Здесь исключение. Поэтому он не может попросить репортера обратиться к библиотеке, потому что это исключение. Трамп должен немедленно вернуться с ответом: 2 (не поддельные новости).

Разрешение значения по дереву

Чтобы упростить это, все сначала решается с человеком, а затем вверх, в библиотеку, и если информация там не содержится, вопрос идет к высшему авторитету: либо Бог, либо монстр Спагетти, как это может быть быть. Затем вы продолжаете идти все выше и выше, пока не получите ответ. В конце концов, все ответы будут решены.

Резюме

Это концепция в двух словах. Короче говоря, свойство зависимостей является свойством, которое разрешается локально или вверх по дереву пользовательского интерфейса в зависимости от ситуации. Причина, по которой мы это делаем, состоит в том, что элементы пользовательского интерфейса имеют сотни и сотни или свойства, которые вскоре съедят вашу память, если вы будете хранить их в качестве полей поддержки в каждом из них. Но поскольку большинство из этих полей никогда или очень редко меняются, нет необходимости хранить их в качестве полей поддержки, и их значения могут быть разрешены путем перехода к дереву. Конечно, аналогия немного напряжена, но я надеюсь, что это кому-то поможет.

2
ответ дан 20 июня '17 в 13:23
источник