За что отвечает WPF GUI? - PullRequest
       5

За что отвечает WPF GUI?

3 голосов
/ 09 ноября 2010

Я давно пользуюсь WPF и Xaml и мне это очень нравится.Тем не менее, я, вероятно, все еще разрабатываю вещи, как я делал в дни WinForm, имея слишком много кода и ответственности в разделе GUI.

В любом случае, в модели WPF за что именно отвечает GUI?Если нажата кнопка в графическом интерфейсе, должна ли она отображать всплывающее окно и обрабатывать какие-либо обновленные значения?Если существует логика проверки, следует ли проверять и обновлять пропущенные / недействительные поля?Должна ли она обрабатывать какую-либо логику обработчика событий, такую ​​как щелчки, изменение значения и т. Д.?

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

Ответы [ 3 ]

3 голосов
/ 09 ноября 2010

интерфейс wpf технически может делать все что угодно в зависимости от подхода. Вы должны увидеть некоторые из первых wpf-приложений, с которыми я работал, и с которыми я до сих пор работаю. Если вы хотите следовать передовым методам и максимально эффективно использовать wpf, вам следует использовать шаблон MVVM.

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

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

В ответ на ваш фундаментальный вопрос, ИМХО представление должно знать, как визуализировать ваши данные, и если вам нужно поведение обновления / редактирования, то оно должно знать, как вызывать команды на модели представления, чтобы сделать это за вас. Любая другая установка начинает сбивать грани между View / Viewmodel / Model и, вероятно, работает против вас.

Надеюсь, это поможет. Эта статья о MVVM действительно помогла мне:

http://www.codeproject.com/KB/WPF/MVVMQuickTutorial.aspx?msg=3655304#xx3655304xx

2 голосов
/ 09 ноября 2010

Вы можете реализовать это многими способами.WPF на самом деле не волнует.

Но есть много архитектурных шаблонов для обработки GUI.Большинство из них помещает как можно меньше кода в части графического интерфейса.Большинство шаблонов, таких как MCV / MVP, подходят для многих GUI-инструментариев.Шаблон, разработанный специально для WPF: MVVM .Выучить MVVM вы можете по книге, поищите в Google или посмотрите несколько видео, в зависимости от того, как вам нравится изучать вещи.

0 голосов
/ 10 ноября 2010

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

Если вы все делаете правильно, большую часть времени ваш обзор будет представлять собой чистый XAML без какого-либо кода. Иногда вам понадобится немного кода, если, например, у вас есть несколько кнопок, которые странным образом взаимодействуют. В этих случаях я часто инкапсулирую эту функциональность в пользовательский элемент управления.

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

Чтобы ответить на ваши конкретные вопросы:

  • Если нажатие кнопки в представлении должно отображать всплывающее окно, появляющееся при каждом отображении объекта (т. Е. Объект переходит в новое состояние), кнопка устанавливает свойство модели представления, а шаблон показывает всплывающее окно, когда свойство имеет значение true.

  • Если нажатие кнопки в представлении должно отображать всплывающее окно только в представлении, где была нажата кнопка, всплывающее окно должно быть определено с использованием триггера события, чтобы оно отображалось при нажатии кнопки.

  • Если нажатие кнопки в представлении должно переключать логическое значение, просто ToggleButton или один из его подклассов и привязать его к значению.

  • Если нажатие кнопки в представлении должно назначить одно значение одному полю, к нему должна быть прикреплена команда, которая делает именно это (т. Е. У вас может быть команда «SetProperty» с параметрами, указывающими, какое свойство и какое значение).

  • Если нажатие кнопки в представлении должно обновить несколько значений или сделать это сложным образом, вы должны использовать модель представления и справиться со сложностью там.

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

  • Если существует логика проверки для проверки пропущенных обязательных полей, она должна быть в самой вашей модели, поскольку этому объекту присуща концепция valid. Свойство объекта модели должно указывать на наличие пропущенных полей.

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

  • Ваше мнение не должно никогда обрабатывать событие Click, кроме как в простой минутной программе. Вы должны использовать команду, встроенную или определенную вами. Для простых случаев команда может быть вызвана с использованием только XAML (например, SetProperty или Paste). Если для обработки вашей команды требуется специальный код, этот код должен быть в вашей модели или модели представления.

  • Ваше мнение должно никогда обрабатывать значения, измененные событиями. Система связывания WPF очень хорошо справляется с этим. В ситуациях, когда встроенного механизма WPF недостаточно, необходимо создать пользовательский элемент управления или присоединенное свойство, которое обрабатывает конкретный сценарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...