В чем разница между свойством и свойством зависимости - PullRequest
36 голосов
/ 09 сентября 2010

Свойства зависимостей создаются так же, как свойства.

Используется ли свойство зависимостей только при создании пользовательского элемента управления?

Ответы [ 5 ]

56 голосов
/ 09 сентября 2010

Свойства зависимости и стандартные свойства совершенно разные.

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

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

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

22 голосов
/ 09 сентября 2010

Преимущества зависимой собственности

На самом деле свойство зависимостей имеет много преимуществ по сравнению с обычными свойствами CLR.

  1. Наследование значения свойства: Под наследованием значения свойства мы подразумеваем, что значение свойства Dependency может быть переопределено в иерархии таким образом, что в конечном итоге будет установлено значение с наивысшим приоритетом.
  2. Проверка данных: Мы можем навязать проверку данных, которая будет запускаться автоматически при изменении значения свойства.
  3. Участие в анимации: Свойство зависимости может анимироваться. WPF анимация имеет множество возможностей для изменения значения с интервалом. Определяя свойство зависимости, вы можете в конечном итоге поддерживать анимацию для этого свойства.
  4. Участие в стилях: Стили - это элементы, определяющие элемент управления. Мы можем использовать Style Setters на свойстве Dependency.
  5. Участие в шаблонах: Шаблоны - это элементы, которые определяют общую структуру элемента. Определив свойство Dependency, мы можем использовать его в шаблонах.
  6. DataBinding: Поскольку каждое из свойств Dependency само вызывает INotifyPropertyChanged всякий раз, когда изменяется значение свойства, DataBinding поддерживается внутренне. Чтобы узнать больше о INotifyPropertyChanged, пожалуйста, прочитайте.
  7. CallBacks: Вы можете иметь обратные вызовы для свойства зависимостей, поэтому при каждом изменении свойства вызывается обратный вызов.
  8. Ресурсы: Свойство Dependency может принимать Resource. Таким образом, в XAML вы можете определить ресурс для определения свойства зависимости.
  9. Переопределения метаданных: Вы можете определить определенное поведение свойства зависимостей, используя PropertyMetaData. Таким образом, переопределение формы метаданных производного свойства не потребует от вас переопределения или переопределения всего определения свойства.
  10. Поддержка конструктора: Свойство зависимости получает поддержку от Visual Studio Designer. Вы можете увидеть все свойства зависимостей элемента управления, перечисленные в окне свойств конструктора.

В них некоторые функции поддерживаются только свойством зависимости. Animation, Styles, Templates, Наследование значения свойства и т. Д. Можно принимать только с использованием свойства Dependency. Если в таких случаях вы используете свойство CLR, компилятор выдаст ошибку.

Пожалуйста, просмотрите эти статьи,

http://www.codeproject.com/KB/WPF/BeginWPF4.aspx#diff

и http://www.dotnetfunda.com/articles/article961-wpf-tutorial--dependency-property-.aspx

и http://msdn.microsoft.com/en-us/library/cc221408(VS.95).aspx

7 голосов
/ 09 сентября 2010

Свойство зависимости - это свойство (не само, но зависит от другого, скажем, свойство привязки XAML), которое регистрирует другое свойство.

Свойство зависимостей регистрирует другое свойство привязки в коде, регистрируя его. Пример, который используется в моем проекте, выглядит следующим образом:

public static DependencyProperty ImageUri = DependencyProperty.Register("Source", typeof(BitmapImage), typeof(CustomImagePlaceHolder), new PropertyMetadata(null));

В приведенном выше коде ImageUri - это свойство зависимости, которое регистрирует источник, который определен / объявлен внутри generic.xaml (независимо от того, объявлен ли он, определен или что-то еще) следующим образом:

..HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}"
/>

Так что здесь очень важно, чтобы значение привязки шаблона в XAML было зарегистрировано как свойство зависимости в коде позади.

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

Мы должны сказать, какой тип свойства зависимости заключается в том, что в приведенном выше примере Source является типом BitmapImage, поэтому мы определили typeof (BitmapImage).

Теперь владельцем / родителем этого свойства зависимостей является наш customControlClass CustomImagePlaceHolder, и мы снова определили это при регистрации.

Теперь, чтобы установить значение свойства depndency, используя наши свойства, как показано ниже:

public BitmapImage Source
        {
            get
            {

   string strURI = (string)GetValue(CustomImagePlaceHolder.ImageUri);
                return new BitmapImage(new Uri(strURI));
            }
            set
{
SetValue(CustomImagePlaceHolder.ImageUri, value);
 }

        }

Теперь, как это происходит, мы устанавливаем значение из нашего кода позади или xaml в свойство источника, определенное выше, и inturn устанавливает значение свойства зависимостей ImageUri, которое inturn устанавливает значение в привязке шаблона Source, поскольку мы зарегистрировали ImageUri в качестве источника, то есть нет - generic.xaml.

0 голосов
/ 08 мая 2017

Основное различие между понятием зависимости и стандартным свойством clr заключается в том, что свойство зависимости может быть целью привязки. Это позволяет привязать значение свойства к значению, предоставленному другим объектом.

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

Если ваше свойство обычно является источником привязки данных (например, предоставление текста для TextBlock), я бы порекомендовал использовать стандартное свойство CLR и иметь содержащий класс, реализующий INotifyPropertyChanged.

Далее ....

Свойство зависимости обеспечивает функциональность, которая расширяет функциональность свойства в отличие от свойства, которое поддерживается полем. Часто каждая такая функция представляет или поддерживает определенную функцию из общего набора функций WPF.

Ресурсы

Привязка данных

Стили

Анимация

Метаданные переопределяют

Значение свойства наследования

http://msdn2.microsoft.com/en-us/library/ms752914.aspx

Надеюсь, это поможет.

0 голосов
/ 04 августа 2015

Если вы наберете propdp и нажмете символ табуляции в редакторе VS, то автоматически сгенерированная документация свойств зависимости будет установлена ​​как:

// Использование DependencyProperty в качестве резервного хранилища для MyProperty.
Это включает анимацию, стилизацию, привязку и т. Д. *

...