DependencyProperty.Register() или .RegisterAttached()

В чем разница между ними, когда следует использовать RegisterAttached() вместо .Register()?


person Sander Rijken    schedule 26.05.2009    source источник


Ответы (3)


Я предполагаю, что вы имели в виду DependencyProperty.Register и DependencyProperty.RegisterAttached.

DependencyProperty.Register используется для регистрации обычного свойства DependencyProperty. Вы можете рассматривать их как обычные свойства с добавлением того, что они могут принимать участие в привязке данных WPF, анимации и т. д. На самом деле они представлены как обычное свойство (с методами доступа get и set) поверх нетипизированного DependencyObject.SetValue. /Получить значение. Вы объявляете их как часть своего типа.

Присоединенные свойства, с другой стороны, отличаются. Они предназначены для расширения системы. Если вы когда-либо использовали расширители в Windows Forms, они в чем-то похожи. Вы объявляете их как часть типа для использования в другом типе.

Они часто используются для информации, связанной с макетом. Например, Canvas нужны координаты Left/Top, Grid нужны Row и Column, DockPanel нужна информация о Dock и т.д. Было бы беспорядок, если бы все это нужно было объявлять на каждом элементе управления, который может быть размещен. Так они объявлены на соответствующей панели, но используются на любом Контроле.

Вы можете использовать то же самое, чтобы прикрепить любую информацию к DependencyObject, если вам нужно. Может оказаться полезным просто объявить часть информации, которую вы можете установить в xaml, чтобы использовать ее позже в стиле, например, для существующего класса.

Таким образом, эти два вида DependencyProperty служат совершенно разным целям. Обычные свойства (зарегистрированные через Register()) используются так же, как и обычные свойства, как часть интерфейса вашего типа. Присоединенные свойства (зарегистрированные с помощью RegisterAttached()) используются в качестве точки расширения для существующих классов.

Надеюсь, это немного прояснит ситуацию.

person Denis Troller    schedule 27.05.2009
comment
Значит, присоединение можно использовать для добавления свойств к классам, которыми вы не владеете? В этом разница? - person Vaccano; 12.05.2010
comment
Вы также можете установить свойства зависимости, которые не присоединены к другому объекту: this.button.SetValue(TextBox.TextProperty, "text"); (где this.button имеет тип System.Windows.Controls.Button). Это прекрасно, поэтому ответ не совсем полный. Там должно быть больше к этому. - person bitbonk; 07.08.2014

Разница между DependencyProperty.Register() и DependencyProperty.RegisterAttached() заключается в том, что .Register() используется для регистрации «обычного» свойства зависимости в DependencyObject, а .RegisterAttached() используется для установки «присоединенного» свойства зависимости.

Разница между двумя типами свойств зависимостей довольно проста: обычные свойства зависимостей устанавливаются для определенного объекта DependencyObject точно так же, как и для любого другого свойства .NET. Присоединенные свойства, с другой стороны, связаны с конкретным объектом DependencyObject (например, Grid), но устанавливаются в совершенно отдельном объекте DependencyObject, часто являющемся дочерним элементом объекта DependencyObject, который определяет присоединенное свойство (например, Grid.Row, присоединенное свойство, устанавливается на дочерних элементах родительской сетки).

Дополнительные сведения о прикрепленных свойствах на MSDN.

person Nicholas Armstrong    schedule 27.05.2009

Свойство, зарегистрированное с помощью Register или RegisterAttached, может быть присоединено к любому объекту DependencyObject с помощью SetValue и GetValue. Но если вы прикрепите свойство, зарегистрированное с помощью Register, к объекту типа, отличного от ownerType, его метаданные не будут использоваться (за исключением значения по умолчанию). Это означает, что такие атрибуты, как Inherits или AffectsMeasure, не будут работать для этих свойств. Вы должны использовать RegisterAttached, если вас интересуют метаданные о прикрепленных свойствах.

Подробнее см. в моем ответе на аналогичный вопрос: Разница между прикрепленными и неприкрепленными свойствами зависимостей в Silverlight

person srgstm    schedule 19.09.2011