Одна из проблем с элементами управления Silverlight заключается в том, что, когда свойства привязаны к коду, они больше не доступны для редактирования в Blend. Например, если у вас есть ListView, который заполняется из канала данных, при редактировании элемента управления в Blend элементы не отображаются.
Я слышал, что шаблон MVVM, созданный сообществом разработчиков WPF, также может помочь в сохранении «смешиваемости» элементов управления Silverlight. Я все еще пытаюсь понять это, но вот несколько объяснений:
Одним из потенциальных недостатков является то, что шаблон требует дополнительных классов, хотя и не обязательно большего количества кода (как показано второй ссылкой выше). Мысли?





Я не уверен, что смогу ответить на ваш вопрос, но я нашел очень ценную статью ниже. Йонас Фоллесо использует ninject для отключения своих сервисов в режиме дизайна / смешивания. Очень хорошо!
http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx
Я пробовал несколько вариантов и остановился на MVVM как на лучшем для меня выборе. Смешиваемость - важный момент, и я также считаю, что аспект виртуальной машины интуитивно понятен для настройки динамического поведения, процедурных эффектов и анимации (например, Silverlight.FX от Nikhil). В какой-то момент я попытался полностью избежать Blend через плавные интерфейсы, но нахожу связь между пользовательским интерфейсом и поведением слишком болезненной в долгосрочной перспективе. Я хочу спроектировать свой пользовательский интерфейс в Blend, а затем добавить эффекты и другое поведение в код, это оказалось для меня лучшим шаблоном, которому я мог бы следовать до сих пор.
Я определенно думаю, что вам следует использовать шаблон MVVM для приложений Silverlight - и одно из преимуществ этого шаблона заключается в том, что вы можете действительно сделать свое приложение действительно смешиваемым с помощью некоторых простых методов. Я часто называю «смешиваемость» «дизайном для удобства проектирования» - вы используете определенные методы, чтобы ваше приложение отлично выглядело в Blend.
Один из методов - как указывает Торбьорн - заключается в использовании инфраструктуры внедрения зависимостей и предоставлении различных реализаций ваших внешних служб в зависимости от того, выполняется ли код в Blend или в браузере. Поэтому я настраиваю свой контейнер для использования фиктивного поставщика данных, когда код выполняется в Blend, и таким образом вы получаете поддержку времени разработки для ваших списков, сеток данных и т. д.
Проблема часто заключается в том, как установить DataContext декларативно - поэтому я часто заканчиваю тем, что использую класс локатора служб в качестве «внешнего интерфейса» к контейнеру IoC. Таким образом я могу привязать контекст данных к свойству в локаторе службы.
Другой способ - создать какой-то элемент управления ObjectDataSource (невизуальный), который имеет два свойства: контекст данных времени разработки и контекст данных времени выполнения. Элемент управления определяет, где выполняется, а затем устанавливает для родительского контекста данных нужный объект.
В последнее время я использую MVVM в нескольких разных проектах Silverlight, и он работает очень хорошо, я определенно рекомендую его. Сообщение Йонаса - отличное место для начала, недавно я также использовал блоггинг в своих опытах с MVVM и создал действительно простое решение для демонстрации основных точек соприкосновения.
Я всегда думал, что MVVM и PresntationModel http://martinfowler.com/eaaDev/PresentationModel.html по сути одно и то же. PresentationModel намного проще сказать. Я успешно использовал его в java swing, windows forms, WPF и silverlight. Если вы думаете о разделении проблем, модель презентации имеет большой смысл. У вас есть один класс, единственная задача которого - предоставить модель, удобную для презентации. На самом деле не имеет значения, какая технология используется для отображения его на экране. Это может изменить некоторые детали реализации, но разделение проблем - хорошая идея, независимо от того, как вы показываете информацию. Благодаря такому разделению вы можете легко писать тесты для вашей модели представления независимо от технологии представления. Так что это плюс.
Я думаю, многие из нас ждут, когда первопроходцы продолжат работу и создадут действительно хорошие образцы приложений с использованием MVVM в Silverlight (и WPF, если на то пошло). Есть ряд сложных областей, таких как отсутствие ICommand в Silverlight или сложность запуска и остановки взаимодействие с анимацией только с использованием привязки данных.
Тем не менее, это определенно образец, на который стоит обратить внимание в будущем, и его стоит попробовать, если вы не против иногда «жульничать» в тех местах, где вы не можете понять это.
Я согласен с йонасом. MVVM кажется мне моделью, которая лучше всего работает для меня (хотя Джон Папа считает, что MVP имеет больше смысла). У меня есть статья MSDN об этом, которая выйдет в марте, и, надеюсь, ответит на призыв и даст хороший пример.
Кстати, я хотел бы видеть некоторую сплоченность в отделе MVVM Framework. Пока еще нет хорошего решения для фреймворка. Мне нравится Jonas (я думаю, что Jonas - это FX Framework), но, поскольку он не совместим с WPF, для некоторых это может быть неправильным выбором.
Я также согласен с Йонасом относительно MVVM с Silverlight. Я действительно считаю, что MVP - тоже хороший выбор, но недавно у меня было время попробовать как MVP, так и MVVM с Silverlight, и я гораздо более доволен результатами MVVM. (Да, я передумал, чем больше использовал MVVM). VM абстрагирует привязку модели от представления (очевидно) в MVVM, что позволяет использовать больше сценариев привязки (по крайней мере, более чистые способы их выполнения), чем с помощью MVP. Однако это всего лишь один аспект.
Я опубликую на своем сайте несколько примеров MVP и MVVM с Silverlight.
Мне нравится шаблон ViewModel, и я очень его рекомендую. В моем блоге есть несколько статей типа "начало работы с ViewModel".
С выпуском Prism v2 от P&P в феврале 2009 г. для Silverlight и WPF стала доступна еще лучшая поддержка MVVM. Подробнее см. microsoft.com/compositewpf.
Есть очень хорошее видео, знакомое с шаблоном MVVM на Techdays 2010, с четким объяснением:
Для более сложных приложений, требующих более высокой степени автоматизированного тестирования, это определенно имеет смысл, и переход от привязки DependencyProperties к привязке DataContext намного удобнее, чем ее аналог в ASP.NET.
Самая большая проблема, с которой я столкнулся с Silverlight, - это тестирование фактического пользовательского интерфейса (я думаю, что на данный момент существует одна коммерческая структура) и огромное количество вызовов событий, с которыми вы сталкиваетесь при использовании служб WCF (или WebClient, если на то пошло) с Silverlight.
Взгляните на мою статью о MVVM и Silverlight в реальных проектах и решайте сами.
http://alexburtsev.wordpress.com/2011/03/05/mvvm-pattern-in-silverlight-and-wpf/
Я также рекомендую вам использовать IOC, Caliburn-Micro и Ninject, чтобы получить отличную комбинацию.