Мы подходили к этому в прошлых проектах, применяя модифицированную версию шаблона 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.
Конечный результат
- Вы можете легко изменять объекты модели данных. Изменения в модели данных не повлияют на пользовательский интерфейс.
- Вы можете легко изменять вид объектов модели. Если вы хотите изменить поведение программы, модель данных не должна изменяться, равно как и макет элемента управления. Если более одной формы или пользовательского элемента управления используют одну и ту же модель представления, у вас есть согласованность между различными представлениями в вашей программе.
- Вы можете легко изменять формы и пользовательские элементы управления. Если вы хотите изменить внешний вид, вам не нужно беспокоиться об изменении поведения программы или модели данных. Код для каждой формы крошечный.