Использование MVVM в больших приложениях - обмен файлами, моделями, состояниями и т.д.

Мне было интересно, знает ли кто-нибудь из вас хороший учебник, объясняющий MVVM для больших приложений. Каждое учебное пособие по MVVM, которое я нашел, объясняется только основами (как реализовать модель, viewmodel и представление), но мне любопытно, какие методы и шаблоны возникают при передаче данных между страницами приложений, где запускать режимы просмотра, где хранить общие приложения данные (разделяемые между несколькими режимами просмотра) и т.д.

Я предпочитаю чистые решения С#/XAML без каких-либо фреймворков MVVM (MVVMLight и т.д.).

Ответ 1

методы и шаблоны, когда дело доходит до передачи данных между страницы приложений

Если передача данных управляется событиями (т.е. вы хотите уведомить, когда вы получаете данные, переданные с сервера), используйте слабые события. Prism EventAggregator - одна из многих реализаций.

Если передача данных постоянна, пусть DataContext обтекает дерево XAML и просто использует привязку.
Это означает, что если у вас есть "главный" UserControl, который использует другие, более конкретные, UserControls, не устанавливайте свой DataContext, они наследуют мастера, и все хорошо.
Если вы хотите разделить функциональность, используйте композицию в главной модели.

где для запуска viewmodels

Пуристы скажут вам, чтобы они инстанцировали их непосредственно в XAML. Я почти никогда этого не делаю. Прежде всего, ViewModels обычно нуждаются в услугах, и они передаются в качестве параметров конструктора или вводятся через MEF в конструкторе... и т.д. Таким образом, у вас не может быть конструктора без параметров, или это сложнее.

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

где хранить общие данные приложения (разделяемые между несколькими ViewModels)

Если данные глобальны: используйте статические классы/свойства,
в XAML вы можете получить к ним доступ через {x:Static my:StaticClass.StaticProperty}, если хотите достичь вложенного класса/перечисления, используйте + вместо .

Если данные распределяются только между несколькими ViewModels, но не все, используйте наследование/состав на моделях viewmodels вместе с шаблоном контроллера.

Другие советы, собранные по опыту:

  • Свяжите строго то, что вам нужно: не привязывайтесь ко всему объекту, когда вам просто нужна строка.

  • Если вы снова и снова связываете одно и то же, не стесняйтесь делать собственную разметку, наследуя от Binding/MultiBinding. Это DRY 101, но большинство людей просто копируют/вставляют Bindings по какой-то причине.

Пример:

public class VisibilityBinding : MultiBinding, IMultiValueConverter
{
   public VisibilityBinding()
   {
      var isSomething = new Binding("IsSomething");
      isSomething.ElementName = myUsrCtrl;
      this.Bindings.Add(isSomething);

      //Add more bindings

      this.Converter = this;
    }

    //Implement IMultiValueConverter to compute a System.Visibility from the bound values.
}

И в XAML:

 <TextBox Visibility={customMrkup:VisibilityBinding} />
  • Избегайте любых дублирования данных, вплоть до DAL. Сложно очень быстро синхронизировать поля, которые можно просто вывести через я (Multi) ValueConverter.
    Пример. У вас есть аудиофайл. У него есть время начала, время окончания и продолжительность. Избавьтесь от любого из этих 3 свойств, можно сделать третий.

Если я думаю о каких-либо дополнительных советах, я вернусь и добавлю их.

Надеюсь, это поможет!

Ответ 2

Возможно, вам стоит взглянуть на эту книгу: Создание корпоративных приложений с помощью Windows Presentation Foundation и Model View ViewModel Pattern (например, Amazon.com).

Он приближается к MVVM в более общем контексте, а не только в 5-минутном фрагменте кода, и даже дает суждения о том, как вы могли бы организовать бизнес-решение.

Мы часто использовали его в качестве справки на работе. Лично я хотел бы, чтобы это углубилось в детали. Но, тем не менее, приятно читать, чтобы попасть в MVVM с точки зрения бизнес-приложений.

Текст описания:

Создание богатых, гибких и поддерживаемых бизнес-приложений с шаблоном проектирования MVVM

Упростите и улучшите разработку бизнес-приложений, применяя MVVM для Windows Presentation Foundation (WPF) и Microsoft® Silverlight® 4. Используя это практическое руководство, вы будете использовать MVVM с данными привязка, команды и поведение для создания пользовательских интерфейсов в сочетании с бизнес-логикой. MVVM идеально подходит для разработчиков .NET, работающих с WPF и Silverlight - есть ли у вас опыт создания корпоративные приложения.

Узнайте, как:

  • Погрузитесь в MVVM и узнайте, как он отличается от других шаблонов пользовательского интерфейса Создайте простое приложение для управления взаимоотношениями с клиентами, которое вы можете адаптировать для своих собственных проектов.
  • Внедрить MVVM для поддержания разделения между декларативным синтаксисом пользовательского интерфейса и логическим кодом представления
  • Создание модели домена для определения бизнес-контекста приложений.
  • Введите динамический код для уровня доступа к данным с помощью Microsoft Entity Framework и NHibernate
  • Внедрить сложные сценарии проверки данных с помощью Windows Workflow Foundation 4
  • Внедрение MVVM с использованием фреймворков и наборов инструментов, таких как Microsoft Prism

Ответ 3

Прежде всего, вы можете создать BaseViewModel с некоторыми свойствами, которые являются общими для всех ViewModels. Используйте Injection Dependency, например Castle/Prism4 для отправки данных из одной в другую, мы использовали Призмы EventAggregator Надеюсь, это поможет в ваших поисках. Но, как сказал Джон, это полностью зависит от вас, что вы предпочитаете использовать. Но это хорошие отправные точки.