Уведомить все элементы управления в WPF с определенными атрибутами - PullRequest
0 голосов
/ 18 ноября 2009

Как я могу сообщить всем subControls в WPF, что они, например, расширятся?

Не каждый SubControl должен быть проинформирован ... только те, кто может, например. принять другой элемент для отбрасывания.

Возможно, вы знаете еще одну возможность, позволяющую предметам менять свой цвет, когда они принимают определенные dropContent.

1 Ответ

1 голос
/ 18 ноября 2009

Вариант 1

Если ваши субконтроли реализованы в вашем собственном коде, хороший способ:

  1. Создать кастом RoutedEvent
  2. Отправлять перенаправленное событие от родителя всякий раз, когда вы хотите сообщить субконтролю о чем-либо
  3. Обрабатывать перенаправленное событие в субконтролях и отвечать желаемым поведением (например, расширением, если они являются удаляемыми целями)

Вы можете добавить параметры к перенаправленному событию EventArgs, чтобы информировать субконтроли о специфике изменения, о котором вы сообщаете.

Вариант 2

Если вы хотите повлиять на элементы управления, которые вы не создаете и не можете контролировать, вы можете рекурсивно спускаться по визуальному дереву, используя VisualTreeHelper.GetChildrenCount() и VisualTreeHelper.GetChild(), и вносить любые необходимые изменения в найденные элементы управления. Это более мощный метод, чем RoutedEvent, но во многих случаях он не обеспечивает столь же хорошую абстракцию, что приводит к тому, что код будет сложнее поддерживать в долгосрочной перспективе.

Вариант 3

Использовать унаследованное вложенное свойство. Установка свойства для родителя приведет к тому, что свойство будет распространяться вниз до каждого потомка, каждый раз вызывая ваш PropertyChangedCallback. В вашем PropertyChangedCallback вы можете вносить любые необходимые изменения в дочерние элементы управления.

Это может быть лучше, чем рекурсивный спуск по визуальному дереву, потому что вы также получите PropertyChangedCallback s, если к вашему дереву будут добавлены новые элементы управления. Это означает, что новые дочерние элементы, которые будут добавлены позже (например, посредством привязки данных), также получат обновленные функции (например, они также расширятся, если они являются объектами удаления). Другое преимущество состоит в том, что унаследованные свойства распространяются как по логическому дереву, так и по визуальному. Недостатком является то, что они могут быть медленнее, чем VisualTreeHelper, и немного больше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...