Зачем регистрировать DP как прикрепленное свойство, а затем не реализовывать для него оболочку (WPF)

после ответа от @ sky-dev здесь я мог бы реализовать решение к проблеме воздушного пространства в WPF при работе с элементом управления WinFormsHost. Но я новичок в WPF, и теперь я пытаюсь понять его код, и я не понимаю, почему некоторые свойства зависимостей определены как присоединенные свойства, а затем их оболочки реализуются как для обычных свойств зависимостей.

Попробую лучше объяснить мою путаницу с кодом:

Сначала определяются свойства зависимости:

public class AirspacePopup : Popup
{
    public static readonly DependencyProperty IsTopmostProperty =
        DependencyProperty.Register("IsTopmost",
                                    typeof(bool),
                                    typeof(AirspacePopup),
                                    new FrameworkPropertyMetadata(false, OnIsTopmostChanged));

    public static readonly DependencyProperty FollowPlacementTargetProperty =
        DependencyProperty.RegisterAttached("FollowPlacementTarget",
                                            typeof(bool),
                                            typeof(AirspacePopup),
                                            new UIPropertyMetadata(false));

    public static readonly DependencyProperty AllowOutsideScreenPlacementProperty =
        DependencyProperty.RegisterAttached("AllowOutsideScreenPlacement",
                                            typeof(bool),
                                            typeof(AirspacePopup),
                                            new UIPropertyMetadata(false));

    public static readonly DependencyProperty ParentWindowProperty =
        DependencyProperty.RegisterAttached("ParentWindow",
                                            typeof(Window),
                                            typeof(AirspacePopup),
                                            new UIPropertyMetadata(null, ParentWindowPropertyChanged));

Как видите, первый DP определяется как обычный DP, поскольку он зарегистрирован с помощью метода DependencyProperty.Register (..), но остальные DP определены как Attached, поскольку они зарегистрированы с помощью DependencyProperty.RegisterAttached ( ..) метод.

Теперь обертки:

public bool IsTopmost
    {
        get { return (bool)GetValue(IsTopmostProperty); }
        set { SetValue(IsTopmostProperty, value); }
    }
    public bool FollowPlacementTarget
    {
        get { return (bool)GetValue(FollowPlacementTargetProperty); }
        set { SetValue(FollowPlacementTargetProperty, value); }
    }
    public bool AllowOutsideScreenPlacement
    {
        get { return (bool)GetValue(AllowOutsideScreenPlacementProperty); }
        set { SetValue(AllowOutsideScreenPlacementProperty, value); }
    }
    public Window ParentWindow
    {
        get { return (Window)GetValue(ParentWindowProperty); }
        set { SetValue(ParentWindowProperty, value); }
    }

Все оболочки реализованы для обычного DP ... Насколько я знаю, если DP зарегистрирован как прикрепленный, оболочка должна быть примерно такой:

public static bool GetFollowPlacementTarget(UIElement element)
{
    if (element == null)    
    {        
        throw new ArgumentNullException(...);
    }
    return (bool)element.GetValue(FollowPlacementTarget); 
}

public static void SetFollowPlacementTarget(UIElement element, bool value) 
{    
    if (element == null)
    {
        throw new ArgumentNullException(...);
    }
    element.SetValue(FollowPlacementTarget, value);
} 

Итак, в чем может быть причина для регистрации свойства зависимости как присоединенного свойства, если у него нет оболочки для использования его как присоединенного свойства в XAML? Не мог бы кто-нибудь объяснить, почему этот код реализован именно так?

Спасибо.


person MorgoZ    schedule 06.01.2015    source источник
comment
Возможно, вам стоит спросить автора этого кода.   -  person Clemens    schedule 06.01.2015
comment
Это не имеет большого значения. Когда вы полностью удаляете обертки, привязка данных должна работать нормально. Пострадает только кодированный доступ (против MVVM).   -  person Henk Holterman    schedule 06.01.2015
comment
Похоже, еще один недостаток дизайна WPF   -  person Alejandro    schedule 05.03.2015