Разделение представления в приложениях с графическим интерфейсом Visual Studio с использованием шаблонов проектирования - PullRequest
3 голосов
/ 20 января 2012

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

В настоящее время моя проблема в том, что я хочу, чтобы мой код класса формы был максимально простым.Судя по моим исследованиям, мне кажется, что я хочу реализовать Duplicate Observed Data , чтобы отделить представление от остальной части программы.Есть ли какие-нибудь советы, как это сделать в VS2010 / C #?Или есть лучшие способы сделать то, что я хочу сделать?

Я использую Visual Studio 2010, .Net 4.0, C #, и это приложение Windows Forms.

Предложения по учебным пособиям,книги или примеры с открытым исходным кодом приветствуются.

Редактировать : Я просто найдено эта статья о паттерне MVP, который, вероятно, относится кмне.Но я все равно буду благодарен за вклад.

1 Ответ

2 голосов
/ 20 января 2012

Мы подходили к этому в прошлых проектах, применяя модифицированную версию шаблона MVVM (обычно ассоциируемого с WPF) в Windows Forms. Существует много шаблонного кода, так что подготовьте свои печатные пальцы, но в конечном итоге это очень хорошо окупится.

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

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

  • CompanyName.ProjectName.Models - Содержит объекты вашего домена (включая классы коллекции).
  • CompanyName.ProjectName.ViewModels - Содержит различные классы модели представления (см. Ниже)
  • CompanyName.ProjectName.Views - содержит ваши формы и пользовательские элементы управления

Создание классов домена

  • Начните как можно проще, в основном только свойства с геттерами и сеттерами .
  • Для каждого публичного свойства, представляющего интерес в каждом классе, создать соответствующие Changed события . Например, создайте событие с именем NameChanged, если у вас есть свойство с именем Name. Событие должно вызываться из установщика каждый раз, когда изменяется значение этого свойства.
  • Создание открытых методов, содержащих бизнес-логику , таких как Delete(). Эти методы должны генерировать исключения в случае ошибки. (В более сложных разработках может потребоваться объект контроллера, содержащий бизнес-логику.)

Создание классов ViewModel

Класс ViewModel - это, в основном, класс разработчика кода «на стероидах», за исключением того, что он не имеет никаких сведений о реальных элементах управления или макете того, как он будет использоваться, только о поведении. Обычно существует один ViewModel для каждого класса Model, но вы также можете сделать ViewModel, например, ClassroomView, который отображает List<Student>.

  • Создание открытого, абстрактного ViewModelBase класса, который реализует IDisposable и INotifyPropertyChanged.
  • Создание классов для каждого объекта домена , который вы хотите визуализировать, или группы объектов, которые вы хотите визуализировать. Эти классы должны наследоваться от ViewModel.
  • Создайте общедоступные свойства только для чтения для отображения в классе модели представления, представляющие то, что вы хотите отобразить на экране. Например, в классе PersonViewModel, если вы хотите отобразить полное имя, создайте свойство с именем FullName, где получатель может объединить свойства FirstName и LastName связанной модели Person.
  • Каждый класс ViewModel также должен иметь свойство , которое относится к базовым данным объект модели.
  • Создание других общедоступных свойств для чтения / записи для отображения, например:
    • bool свойства типа IsHeadOfHouseHousehold для привязки к флажкам или переключателям.
    • Color свойства типа HighlightColor для привязки к BackColor / ForeColor / etc различных элементов управления.
    • string свойства, которые позволяют редактировать базовый объект модели данных путем привязки к текстовым полям.
  • Когда создается объект ViewModel, он должен регистрироваться для всех событий для базового объекта модели данных, такого как FirstNameChanged. В обработчиках событий вы должны вызывать событие PropertyChanged для любых свойств в модели представления, которые затрагиваются. Например, обработчик для события FirstNameChanged должен вызвать PropertyChanged для FullName.
  • В методе Dispose необходимо отменить регистрацию в событиях модели данных, чтобы предотвратить утечки памяти.
  • Создание открытых методов, представляющих пользовательские действия и команды, которые они могут выполнять, например Delete(). Методы должны быть написаны с точки зрения пользователя, чтобы они могли вызывать диалоговые окна с надписью «Вы уверены?» Затем они должны вызывать методы объекта модели данных или какого-либо другого объекта контроллера.

Создание видов

ОК, теперь легкая часть:

  • Добавьте ваши объекты ViewModel в качестве источников данных проекта в ваше решение.
  • Создание форм и пользовательских элементов управления путем размещения необходимых элементов управления на экране. Создание TextBoxes, DataGrids и т. Д. Для каждого свойства, которое должно быть связано с экземпляром ViewModel, используйте свойство (DataBindings) для привязки к источникам данных вашего проекта. Когда вы создаете привязки данных, он автоматически создает компоненты BindingSource .
  • В основной форме создайте начальный экземпляр вашей модели данных , загрузите с диска и т. Д.
  • Где необходимо, создайте экземпляры классов ViewModel и задайте свойство DataSource соответствующего BindingSource. Интерфейс автоматически оживет.
  • Для кнопок , написать обработчики событий Click для вызова соответствующего открытого метода в ViewModel.

Конечный результат

  • Вы можете легко изменять объекты модели данных. Изменения в модели данных не повлияют на пользовательский интерфейс.
  • Вы можете легко изменять вид объектов модели. Если вы хотите изменить поведение программы, модель данных не должна изменяться, равно как и макет элемента управления. Если более одной формы или пользовательского элемента управления используют одну и ту же модель представления, у вас есть согласованность между различными представлениями в вашей программе.
  • Вы можете легко изменять формы и пользовательские элементы управления. Если вы хотите изменить внешний вид, вам не нужно беспокоиться об изменении поведения программы или модели данных. Код для каждой формы крошечный.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...