GUI Design Pattern, MVP, вкладка управления - PullRequest
1 голос
/ 04 августа 2010

У меня есть приложение, у которого есть окно, похожее на окно ниже.

альтернативный текст http://a.imageshack.us/img137/7481/screenshotxh.jpg

Требование заключается в том, что когда пользователь нажимает кнопку Сохранить , все должно быть сохранено. Кнопки «Сохранить» и «Сброс» являются «общими» для всех вкладок. Следовательно, когда выбрана вкладка «Личная информация» и нажата кнопка «Сохранить», программа также должна сохранить изменения, сделанные на вкладке «Друзья», и изменения, сделанные на вкладке «История занятости».

В приложении уже есть код для следующего, и я хочу сохранить этот код:

-ПерсоналИнформационныйПросмотр, PersonalInformationPresenter, PersonalInformationModel

-Друзья, FriendsPresenter, FriendsModel

-Занятость истории трудоустройства, Представление истории трудоустройства, Модель трудоустройства истории

У каждого докладчика есть метод Сохранить .

Вопрос в том, какой будет хороший шаблон проектирования для использования, учитывая, что я хочу сохранить код, который у меня уже есть. Также я хочу, чтобы в этом окне были модель, вид, презентатор. Или, может быть, мне следует немного перефразировать мой вопрос: Каков наилучший способ включения «подпредставлений», «подповедников» при программировании MVP ?

С уважением, MadSeb

Ответы [ 3 ]

1 голос
/ 04 августа 2010

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

0 голосов
/ 04 августа 2010

Я бы заставил вашего нового докладчика использовать ваши подчиненные в качестве аргументов конструктора, что-то вроде:

class DialogPresenter {

    private readonly IDialogView view;
    private readonly PersonalInformationPresenter personal;
    private readonly FriendsPresenter friends;
    private readonly EmploymentHistoryPresenter history;

    void DialogPresenter(IDialogView view, PersonalInformationPresenter personal, FriendsPresenter friends, EmploymentHistoryPresenter history) {
        this.view = view;
        this.personal = personal;
        this.friends = friends;
        this.history = history;
    }

    bool Display() {
        this.personal.Display();
        this.friends.Display();
        this.history.Display();

        return this.view.Display() == DialogResult.Ok;
    }

    void Save() {
        this.personal.Save();
        this.friends.Save();
        this.history.Save();
    }
}

Конечно, если ваши докладчики имеют общий интерфейс между ними, это можно упростить (и сделать более расширяемым), например, так:

class DialogPresenter {

    private readonly IDialogView view;
    private readonly IPresenters[] presenters;

    void DialogPresenter(IDialogView view, IPresenters[] presenters)
    {
        this.view = view;
        this.presenters = presenters;
    }

    bool Display() {
        foreach (var item in this.presenters)
            item.Display();

        return this.view.Display() == DialogResult.Ok;
    }

    void Save() {
        var validation = new List<string>();

        foreach (var item in this.presenters)
            validation.AddRange(item.Validate());

        if (validation.Count > 0) {
                _view.ShowErrors(validation);
                return;
        }

        foreach (var item in this.presenters)
            validation.AddRange(item.Save());
    }
}

Edit: Код вызова будет выглядеть примерно так:

void DisplayForm() {

    using (var frm = new frmDisplay) {

        //or just use DI to get the models etc
        var personal = new PersonalInformationPresenter(personalModel, frm.PersonalTab);    //some properties to expose your views
        var friends = new FriendsPresenter(friendslModel, frm.FriendsTab);
        var history = new EmploymentHistoryPresenter(employmentHistoryModel, frm.HistoryTab);

        var presenter = new DialogPresenter(frm, personal, friends, history);
        if (presenter.Display()) {    
            presenter.Save();
        }
    }
}

Надеюсь, что это вдохновение / помощь:)

0 голосов
/ 04 августа 2010

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

...