Передать DependencyProperty UserControl всем дочерним UserControl

154
01 февраля 2022, 02:10

Есть 3 UserControl, вложенных друг в друга. Для старшего UserControl прописаны DependencyProperty - цвет элементов, которые будут задаваться в разметке и привязываться к DynamicResource, чтобы обновляться в соответствии с темой приложения. Этот цвет должны подхватывать элементы младших UserControl-ов. Каким образом осуществить привязку цвета этих контролов к DynamicResource правильно, чтобы цвет при этом обновлялся при смене темы приложения? При этом вложенные UserControl-ы могут удаляться или добавляться пользователем. До этого в разметке вложенных контролов просто привязывал их цвет к DynamicResource самого приложения, что неверно и не даёт возможность прописывать цвета для разных экземпляров старшего UserControl-а. Нужно при создании вложенного UserControl-а в коде делать привязку всякий раз, когда пользователь создаёт новый экземпляр или есть какие-то механизмы автоматической передачи свойств от старшего контрола всем младшим (Child)?

Answer 1

Эта задача решается созданием наследуемого присоединённого свойства зависимостей. В родительском контроле объявляется такое свойство с обязательным указанием в FrameworkPropertyMetadata опции FrameworkPropertyMetadataOptions.Inherits:

public static readonly DependencyProperty SomeStuffParentUserControlProperty = DependencyProperty.RegisterAttached(
"SomeStuffParentUserControl", 
typeof(double), 
typeof(ParentUserControl), 
new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits));

Затем это свойство либо наследуется потомками:

public static readonly DependencyProperty SomeStuffParentUserControlProperty = ParentUserControl.SomeStuffParentUserControlProperty.AddOwner(typeof(ChildUserControl));

либо делается привязка к свойству с обязательным указанием на родителя в xaml для ChildUserControl:

Width="{Binding (local:ParentUserControl.SomeStuffParentUserControl)}"

Может возникнуть ошибка при записи свойств в xaml - свойство не распознаётся. Тогда надо удалить свойство в родительском UserControl и обратно его вставить. VS тогда начинает распознавать его.

READ ALSO
Скрипт не видит rigidbody

Скрипт не видит rigidbody

Делаю скрипт для перемещения персонажа по урокам в интернетеЗастрял на моменте прыжка

178
Один проект является поддоменом другим?

Один проект является поддоменом другим?

MVC CORE 21; У меня есть два проекта Web ( основной проект, в нём есть форум, блог

156
Источник данных. Не видит нового поля

Источник данных. Не видит нового поля

Добавил в объект новое поле, объект используется как источник данных для RDL отчета, приложение на winformsИспользовал все доступные мне танцы...

89