WPF - Разобщенные органы управления должны общаться - PullRequest
0 голосов
/ 14 ноября 2010

Версия TLDR: Мне нужно найти способ реализовать своего рода «Центр сообщений», где любой элемент управления может зарегистрироваться для получения сообщений от других элементов управления, не зная, откуда поступают эти сообщения (или можетзнаете, пока это не значит для меня никакой дополнительной работы).После написания всего этого, я думаю, я помог себе прийти к пониманию того, что мне нужно, но если вы можете порекомендовать некоторые готовые решения, это было бы здорово!


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

Существует несколько интерфейсов: ITemplate, IContentArea и ISpecificControl. Каждый шаблон имеет некоторое количество областей содержимого.Каждая ContentArea имеет ровно три определенных элемента управления.

Они составляются из чего-то вроде этого грубого рисунка: My Terrible Example

Большой светло-пурпурный прямоугольник - это шаблон.Желтые, розовые и коричневые коробки - это разные конкретные типы IContentArea.Зеленые, светло-синие и темно-фиолетовые блоки - это разные конкретные типы ISpecificControl.

Каждая конкретная реализация этих интерфейсов будет иметь некоторое количество открытых свойств, которые я бы хотел, чтобы пользователь мог установить.

Например: зеленые поля могут позволить вам установить размер шрифта и цвет шрифта.Светло-голубые рамки могут позволить вам установить цвет фона.Темно-фиолетовые рамки могут позволить вам установить размер изображения и поля.Желтые, розовые и коричневые поля позволяют выбрать три конкретных элемента управления, которые вы хотите использовать.Большое светло-фиолетовое поле позволяет выбрать расположение областей содержимого (некоторые могут иметь только две или три, может быть, они расположены по диагонали).

Я создал собственный атрибут, которыйЯ могу применить к свойствам в ViewModel, которые помечают их как подходящие для пользовательских изменений, и я выделил некоторое пространство для динамического добавления элементов управления настройками.Идея состоит в том, что пользователь может редактировать ТОЛЬКО ОДИН элемент одновременно.Когда они выберут его, я буду использовать отражение, чтобы изучить открытые свойства ViewModel элемента управления и найти все свойства, помеченные редактируемым атрибутом, посмотреть их типы и динамически сгенерировать элементы управления для их редактирования (с привязками, конечно же,).Мы назовем его «Мастер настройки».

Так что проблема действительно двойная:

1-й: Как бы вы порекомендовали ограничить пользователя только выборомОДИНОЧНАЯ коробка за раз?Ясно, что мне нужны какие-то события или сообщения для всего приложения.Какую форму это примет?И как мне зарегистрировать мой «Мастер настройки», чтобы получать эти сообщения.Я чувствую, что это будет что-то действительно простое, но я упускаю это из виду, потому что оно не кажется правильным или чистым.

Все, что позволяло одному из этих элементов управления отправлять сообщение с надписью: «Эй, я последний, на кого нажали. Если кто-то был выбран, теперь вы не», это решило быпроблема в том, что получающим элементам управления не нужно было знать, откуда поступало сообщение.

Я думал о каком-то статическом «MessageCenter», где при создании каждого элемента управления он регистрируется для передачи сообщений.(в своем конструкторе), используя определенный интерфейс, и любой элемент управления имеет возможность отправлять сообщение в MessageCenter, который затем передает его.Звучит ли это правильно?Я чувствую, что нечто подобное уже существует.Как и функции в Prism (но мне не нужны другие функции).

2nd: Как я могу сообщить своему «Мастеру настроек», что онполучил новый элемент, для которого он должен отображать настройки?Предположительно, решение для первого элемента также может быть использовано для решения этого.Это просто другой вид уведомления.

1 Ответ

0 голосов
/ 14 ноября 2010

Исходя из вашего абзаца TLDR, я бы рекомендовал взглянуть на шаблон агрегатора событий .Если вы ищете существующую реализацию, вы можете взглянуть на Prism's .Я думаю, что Prism немного переработан и ранее опубликовал более простую реализацию .

...