2009-05-15 4 views
4

Это, как я зарегистрировать DependencyProperty:Свойства зависимостей WPF: Почему мне нужно указать тип владельца?

public static readonly DependencyProperty UserProperty = 
     DependencyProperty.Register("User", typeof (User), 
      typeof (NewOnlineUserNotifier));                             


    public User User 
    { 
     get 
     { 
      return (User)GetValue(UserProperty); 
     } 
     set 
     { 
      SetValue(UserProperty, value); 
     } 
    } 

Третий параметр метода DependencyProperty.Register требуется указать тип контроля, где находится Dependency Property в (в данном случае, мой User Control называется NewOnlineUserNotifier).

Мой вопрос: Почему вы на самом деле указываете тип владельца, и что произойдет, если вы укажете другой тип, чем фактический владелец?

ответ

8

Тип, который вызывается методом Регистра от не де-факто владельца собственности, поэтому вы не можете указать другой тип, чем фактический владелец, так как типа вы определяете является фактическим владельцем.

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

public class ButtonContainer : Control 
{ 
    public Button ChildButton { get; set; } 

    public static readonly DependencyProperty FirstOwnerProperty = 
    DependencyProperty.Register("FirstOwner", typeof(ButtonContainer), 
     typeof(Button)); 

    public ButtonContainer() 
    { 
     ChildButton = new Button(); 
     ChildButton.SetValue(FirstOwnerProperty, this); 
    } 

} 

Теперь кнопка имеет дополнительное свойство, которое имеет смысл только в контексте ButtonContainer и может быть доступно только в контексте ButtonContainer - как типизированные, инкапсулированный Tag.

Используя новый класс следующим образом:

ButtonContainer container1 = new ButtonContainer(); 

ButtonContainer container2 = new ButtonContainer(); 
container2.ChildButton = container1.ChildButton; 

Как ChildButton перемещается из одной емкости в другую ценность его FirstOwnerProperty путешествует с ним, как если бы это был настоящий член класса Button. Container2 может вызывать ChildButton.GetValue (FirstOwnerProperty) и узнать, какой ButtonContainer изначально создал кнопку (почему это может потребоваться для этого, оставлено как упражнение для читателя ...). Все это возможно без необходимости подклассифицировать кнопку на узкую специальность.

+0

Разве мы не должны использовать приложенные свойства, а не обычные 'DependencyProperty' с разными' ownerType'? – Lukazoid

1

Это происходит потому, что то же самое DependencyProperty можно определить по-разному (с различными метаданными) для нескольких типов

1

В двух словах, когда вы регистрации DP, вы добавляете объект (DP) в список прикрепленный к классу (владельцу). Эта операция только «живет» в классе, где она объявлена ​​и часто не связана с ней.

Смежные вопросы