Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Надеюсь, что это немного разъяснит.

Ответ 2

Вы имеете в виду DependencyProperty.Register() и DependencyProperty.RegisterAttached( ), случайно? MSDN не перечисляет DependencyProperty.Attach() или DependencyProperty.AttachRegistered().

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

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

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

Ответ 3

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

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