Поместите это в codebehind или во ViewModel - PullRequest
4 голосов
/ 09 ноября 2010

Я хотел бы получить некоторые мнения о том, когда / если можно поместить код в коде позади. Я занимаюсь этим меньше года. Таким образом, я все еще считаю себя очень "зеленым". Я родом из Дельфи. Итак, кривая обучения была огромной, если не сказать больше - изучение WPF, XAML, C #, Unity, Prism, MEF, .NET, MVVM и т. Д. Забавно, но очень сложно.

Когда я впервые начал работать менее года назад, идея в офисе заключалась в том, чтобы не использовать код в коде, если это вообще возможно, и не просматривать конкретный код в ВМ. Итак, я много раз ломал голову над тем, как определить, как вставлять буквально все в виртуальную машину и держать то, что я считаю, просматривать конкретный код из виртуальной машины только для того, чтобы быть коротким почти всегда Сейчас я точно говорю, я начинаю думать, что кодовый код не всегда плохой или «неправильный». Недавно я пытался очистить некоторые из наших представлений, пытаясь протолкнуть любой код позади виртуальной машины, что привело меня к обнаружению аккуратного фабричного класса в http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html.. Это позволяет вам связывать перенаправленные события с ICommand с в VM. Это работает как шарм, и я смог значительно уменьшить часть нашего кода с его помощью. Однако после этого я ставлю под сомнение свое решение сделать это. Мой подход основывался на философии, которая гласит: «плохо / неправильно», если только в этом нет необходимости. Теперь, когда у меня было немного времени подумать об этом, я не уверен, что рефакторинг был лучшей идеей.

Ниже приведен пример представления, который я реорганизовал. У нас есть новое представление учетной записи, где пользователь вводит SSN и должен заново ввести SSN, прежде чем можно будет создать новую учетную запись. В представлении есть метка, которая отображает текст, сообщающий пользователю, не совпадают ли SSN и повторный SSN, и кнопка OK не активируется, пока они не совпадут. Как только SSN и SSN ключа совпадают, метка исчезает (да, я знаю… я ненавижу это, но я просто разработчик), и кнопка OK активируется. Таким образом, скрытие / отображение метки и включение / отключение кнопки ОК запускается из событий TextChanged в текстовых полях SSN и повторного ввода SSN. Первоначально у меня была логика в codebehind для сравнения двух значений текстового поля и установки свойств viewmodel соответствующим образом, чтобы обновить свойство visible метки и свойство enabled кнопки OK (да, их свойства связаны в XAML). Найдя этот новый фабричный класс, я использовал его, чтобы вставить весь код в viewmodel, и представление работает так же, как и раньше, без использования кода. После успешного рефакторинга представления, я теперь угадываю решение о рефакторинге.

Меня беспокоит то, что если мы хотим иметь другое представление в будущем, а новое представление не хочет обрабатывать несовпадающие SSN таким образом. Возможно, новое представление позволит пользователю вводить несоответствующие номера SSN, а затем отображать сообщение об ошибке при нажатии кнопки ОК. Должно ли новое представление принимать дополнительные издержки кода в модели представления, выполняемой для каждого нажатия клавиши в текстовых полях? Это просто не звучит правильно для меня. Я начинаю думать, что модель представления должна содержать то, что требуется для поддержки того, что нужно представлению, но не делать все для представления. Представление должно быть способно принимать решения на основе чего-либо в модели представления, но не зависеть от виртуальной машины, которая его держит - верно?

1 Ответ

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

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

Конечно, нет ничего «неправильного» в codebehind.

Вот как я справлюсь с вашимПример SSN:

  1. Привязать оба поля SSN к свойствам модели представления
  2. Привязать кнопку ОК к команде в модели представления (я большой поклонник команды Delegateconcept)
  3. Команда должна реализовывать часть CanExecute и возвращать true только тогда, когда оба SSN совпадают.

Не похоже, что сопоставление SSN является проблемой представления, это бизнеспрактика.Это относится к представлению модели.Что бы вы увидели, это то, как ваше приложение показывает , что SSN совпадают или не совпадают.

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