2010-07-13 1 views
1

У меня есть приложение Winform с двумя формами. В одной форме у меня есть элемент управления Tab с 3 вкладками и кнопками навигации для переключения между вкладками.Реализация MVC/MVP Design для TabControl ..design вопрос

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

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

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

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

Edit: Также каждая вкладка содержит пользовательский элемент управления, который я должен инициализировать на смену вкладке

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

EDIT 2: В основном я смущен тем, как получить значения с первой вкладки через контроллер, выполнить обработку и передать ее на следующую вкладку (через контроллер) и установить свойства управления пользователя на второй вкладке (через контроллер). Также вкладка титры удаляются .. please see .. так что форма табуляции больше похожа на форму мастера. поэтому я использовал свойство SelectedIndexChanged.

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

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

ответ

1

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

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

+0

Что делать, если пользователь выбирает другой файл .. тогда придется снова обработать часть? Я хочу отложить обработку до нажатия следующей кнопки/следующей вкладки и где должна выполняться обработка? в контроллере? – Amitd

+0

Что делать, если она этого не делает, 90% -ный случай? Я просто не понимаю, почему вы заставите своего пользователя щелкнуть третью вкладку. Я бы автоматически выбрал его, теперь это уже не имеет значения. Обработка обычно будет в модели, если она заботится о файлах внутри архива. Но я не знаю, как выглядит ваша модель. –

+0

В основном я хочу преобразовать его в шаблон MVx. Но я смущен тем, как получить значения с первой вкладки с помощью контроллера, и перевести его на следующую вкладку (через контроллер) и установить свойства управления пользователя на второй вкладке. (я добавил эту часть как «Edit2».) – Amitd

1

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

Ваш IView выставит методы и события, которые абстрактные ваше взаимодействие с UI позади интерфейса. Поэтому возможно некоторые методы, такие как DisplayFolderContents() и такие события, как FileSelected() и т. Д.

Ваш ведущий подключается к событиям Model и IView и управляет тем, какие методы вызывают на каждом и т. Д. Форма, с которой у вас включен TabControl, - это просто реализация интерфейса IView. У вас может быть другое представление, просто введя реализацию IView в 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 событие поднимается на ваш взгляд, с FileName имеющейся в FileSelectedEventArgs. Презентатор прослушивает это событие и вызывает метод на модели - возможно, ExtractFile(string fileName), передавая имя файла из FileSelectedEventArgs из представления.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^