Получение наследования присоединенного свойства для распространения

У меня возникли проблемы с получением значения прикрепленного свойства для распространения вниз по дереву от родителя к дочернему элементу в визуальной иерархии. Настройка выглядит следующим образом:

У меня есть пользовательская панель, которая создает экземпляр Viewport3D. Затем Panel обрабатывает добавленный и удаленный дочерний элемент для создания и добавления унаследованного класса Visual3D для каждого дочернего элемента.

Я пытаюсь объявить присоединенное свойство с именем свойство AttachedToggle. Я хотел бы, чтобы это свойство находилось во внешнем классе владельца с именем AttachedToggle, который реализует единственное присоединенное свойство зависимостей IsChecked и позволяет родительской панели или любому из дочерних элементов Visual3D иметь возможность изменять значение и иметь экземпляр других элементов. значения отражают изменение. Ни класс Panel, ни класс Visual3D не наследуются от общей базы. Можно ли это сделать?

Я могу успешно изменить как родительское, так и дочернее значение экземпляра IsChecked из кода приложения, используя Set/GetValue, но не могу заставить изменение распространяться.


person giri    schedule 22.11.2010    source источник
comment
Вы включили параметр Inherits в метаданные, когда выполняли RegisterAttached? msdn.microsoft.com/en-us/library/ms753197.aspx   -  person Dan Bryant    schedule 22.11.2010


Ответы (2)


Это должно работать нормально, согласно документам на Наследование значения свойства. Убедитесь, что ваш вызов для регистрации собственности выглядит так:

public static readonly DependencyProperty IsChecked = 
    DependencyProperty.RegisterAttached(
    "IsChecked",
    typeof(Boolean),
    typeof(AttachedToggle),
    new FrameworkPropertyMetadata(false, 
        FrameworkPropertyMetadataOptions.Inherits)
  );

-Обратите внимание на флаг Inherits. См. документы для FrameworkPropertyMetadataFrameworkPropertyMetadataOptions — при необходимости вы также можете использовать OverridesInheritanceBehavior ).

person Philip Rieck    schedule 22.11.2010
comment
Если бы все всегда работало в соответствии с документами. Да, FrameworkPropertyMetadataOptions.Inherits установлен на DP. Но все еще не работает, как ожидалось. - person giri; 22.02.2011

Я не уверен, что прикрепленные свойства распространяются вниз по логическому дереву, но вы можете попробовать что-то вроде этого:

<Panel a:ToggleSwitch="Binding Path=(a:ToggleSwitch), 
           RelativeSource={RelativeSource Mode=FindAncestor, 
           AncestorType={x:Type Panel}}" />
person Dean Chalk    schedule 22.11.2010
comment
Для справки, прикрепленные свойства ДЕЙСТВИТЕЛЬНО распространяются. - person VeV; 06.06.2019
comment
Распространение не является значением по умолчанию и требует добавления соответствующих метаданных в определение свойства. См. этот ответ. - person Drew Noakes; 12.10.2020