Реализация MVC / MVP Design для TabControl .. вопрос дизайна - PullRequest
1 голос
/ 13 июля 2010

У меня есть приложение Winform с 2 формами. В одной форме у меня есть вкладка управления с 3 вкладками и кнопки навигации для переключения между вкладками.

На первой вкладке пользователь выбирает файл, а при переходе на следующую вкладку я хочу сделать несколько обработка файла, выбранного на первой вкладке, и показ результата на 3-й вкладке.

Другая форма просто вызывает эту форму (запустите приложение.)

Как я могу сделать это, используя MVC / MVP?

В настоящее время я создал вложенные формы. Запуск формы приложения создает экземпляр формы вкладки и на SelectedIndexChanged на Управление вкладкой и сопоставление с выбранным свойством вкладки Я выполняю обработку в стартовой форме приложения. При закрытии формы вкладки устанавливаю результат в запуск формы заявки (что не идеально).

Редактировать : Также каждая вкладка содержит пользовательский элемент управления, который я должен инициализировать при изменении вкладки (ссылаясь на данные, выбранные на предыдущей вкладке.)

Простой пример выбирает ZIP-файл на первой вкладке, нажимая кнопку Далее. покажет список файлов внутри zip-файла и на третьей вкладке выполните обработку с помощью файл, выбранный на 2-ой вкладке. (Есть лучшие способы сделать то же самое. Только для примера.)

РЕДАКТИРОВАТЬ 2 : По сути, я запутался в том, как получить значения из первой вкладки через контроллер, выполнить обработку и передать ее на следующую вкладку (через контроллер) и установить свойства пользовательского элемента управления на 2-я вкладка (через контроллер). Также удаляются заголовки вкладок. см. ... поэтому форма вкладок больше похожа на форму мастера. вот почему я использовал свойство SelectedIndexChanged.

В основном мне нужно отделить логику просмотра и обработки от Winform.

Спасибо всем.

Ответы [ 2 ]

1 голос
/ 13 июля 2010

В этом случае ваша модель будет работать с вашим zip-файлом, например, такими методами, как Print(), Extract() и т. Д., И такими событиями, как PrintCompleted и ExtractCompleted и т. Д.

Ваш IView будет предоставлять методыи события, которые абстрагируют ваше взаимодействие с пользовательским интерфейсом за интерфейсом.Так что, возможно, некоторые методы, такие как DisplayFolderContents() и такие события, как FileSelected() и т. Д.

Ваш докладчик подключается к событиям Model и IView и контролирует, какие методы вызываются для каждого и т. Д. Форма, которая у вас естьTabControl on - это просто реализация интерфейса IView.Вы можете получить другое представление, просто внедрив реализацию Presentation в Presenter, включая Mock IView для тестирования.

Значения могут передаваться по шаблону MVP через используемые вами EventArgs.

/// <summary>
/// The event args for a selected file.
/// </summary>
public class FileSelectedEventArgs : EventArgs 
{
    public string FileName { get; private set; }

    public FileSelectedEventArgs(string fileName)
    {
        this.FileName = fileName;
    }
}

Когда пользователь выбирает файл, в вашем представлении возникает событие FileSelected, а имя файла доступно в FileSelectedEventArgs.Presenter прослушивает это событие и вызывает метод для модели - может быть ExtractFile(string fileName), передавая fileName из FileSelectedEventArgs из представления.

Затем докладчик прослушивает событие ExtractCompleted, которое должно быть запущено из модели (которая также имеет любые пользовательские аргументы событий, которые вы хотите) и вызывает соответствующий метод в вашем представлении, передавая параметры из модели.Метод в представлении может делать все, что угодно, с точки зрения отображения данных в TabControl или другим способом.

Это всего лишь один из способов сделать это в любом случае.

1 голос
/ 13 июля 2010

Нечетные варианты для пользовательского интерфейса.В любом случае, нет никакой причины ждать, пока SelectedIndexChanged обработает файл.Вы также можете сделать это, как только файл будет выбран.Это будет работать лучше, вкладка управления станет более отзывчивым.Если вы дождетесь события, то элемент управления будет временно заморожен, поскольку ваш поток пользовательского интерфейса занят итерацией .zip-файла.Пользователь не сочтет это желательным.

Упрощает реализацию MVC, какой бы она ни выглядела.Дополнительным бонусом является то, что вы больше не зависите от TabControl и можете использовать любые элементы управления, которые лучше всего подходят для работы.

...