Взаимодействие между окнами - PullRequest
2 голосов
/ 12 ноября 2008

Каков наилучший / правильный способ взаимодействия между несколькими окнами в приложении C #? Недавно я столкнулся с проблемой, когда одно из окон программы должно вызывать метод, модифицирующий главное окно. Мое решение состояло в том, чтобы создать класс, подобный фабрике, который бы организовывал все базовые данные модели и организовывал связь между различными окнами (через делегатов). Однако, поскольку передача одного или двух делегатов не была проблемой, я начал думать, что если моим другим окнам потребуется 10 делегатов для правильного взаимодействия с основным окном? Являются ли делегаты хорошим решением? Как правильно их передать - через конструктор, свойства? Или, может быть, необходимость использования такого количества делегатов сама по себе является серьезным недостатком дизайна?

Ответы [ 5 ]

3 голосов
/ 12 ноября 2008

Вам необходимо отделить модель от вида контроллером. Поместите объект, который будет иметь как ссылку на форму, так и управлять общей информацией.

Другое решение состоит в том, чтобы отправить ссылку на форму X в форму Y таким образом, чтобы они могли общаться.

1 голос
/ 12 ноября 2008

Мы используем специальный менеджер форм, который использует шаблон субъекта / наблюдателя.

Каждая открытая форма сообщается FormsManager, FromsManager делает себя наблюдателем формы.

Это также делает форму наблюдателем FormsManager.

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

0 голосов
/ 12 ноября 2008

Ранее с MFC было что-то, что уведомляло все окна. Вы передадите идентификатор события с параметром.

Вы можете сделать что-то похожее с одним делегатом, который предоставит идентификатор события и набор параметров.

Самым большим преимуществом этого является то, что окна должны реализовывать только один шлюз.

0 голосов
/ 12 ноября 2008

Вы можете использовать один делегат, используя пользовательские EventArgs для передачи нескольких данных, таких как: тип уведомления, дополнительные параметры и т. Д.

0 голосов
/ 12 ноября 2008

Если нужно только взаимодействовать с главным окном, почему бы не дать ссылку на главное окно в конструкторе других?

public class MainForm : Form
{
}

public class OtherForm : Form
{
    protected MainForm MainForm { get; set; }

    public OtherForm(MainForm mainForm) : base()
    {
        this.MainForm = mainForm;
    }
}

EDIT:

Просто и эффективно.

Если вашим формам нужно взаимодействовать со всеми другими формами приложения, тогда может лучше подойти шаблон типа * locat .

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