Вариант 1
Если ваши субконтроли реализованы в вашем собственном коде, хороший способ:
- Создать кастом
RoutedEvent
- Отправлять перенаправленное событие от родителя всякий раз, когда вы хотите сообщить субконтролю о чем-либо
- Обрабатывать перенаправленное событие в субконтролях и отвечать желаемым поведением (например, расширением, если они являются удаляемыми целями)
Вы можете добавить параметры к перенаправленному событию EventArgs
, чтобы информировать субконтроли о специфике изменения, о котором вы сообщаете.
Вариант 2
Если вы хотите повлиять на элементы управления, которые вы не создаете и не можете контролировать, вы можете рекурсивно спускаться по визуальному дереву, используя VisualTreeHelper.GetChildrenCount()
и VisualTreeHelper.GetChild()
, и вносить любые необходимые изменения в найденные элементы управления. Это более мощный метод, чем RoutedEvent, но во многих случаях он не обеспечивает столь же хорошую абстракцию, что приводит к тому, что код будет сложнее поддерживать в долгосрочной перспективе.
Вариант 3
Использовать унаследованное вложенное свойство. Установка свойства для родителя приведет к тому, что свойство будет распространяться вниз до каждого потомка, каждый раз вызывая ваш PropertyChangedCallback
. В вашем PropertyChangedCallback
вы можете вносить любые необходимые изменения в дочерние элементы управления.
Это может быть лучше, чем рекурсивный спуск по визуальному дереву, потому что вы также получите PropertyChangedCallback
s, если к вашему дереву будут добавлены новые элементы управления. Это означает, что новые дочерние элементы, которые будут добавлены позже (например, посредством привязки данных), также получат обновленные функции (например, они также расширятся, если они являются объектами удаления). Другое преимущество состоит в том, что унаследованные свойства распространяются как по логическому дереву, так и по визуальному. Недостатком является то, что они могут быть медленнее, чем VisualTreeHelper
, и немного больше кода.