Шаблон модели — представление — представление — модель

Автор:

serkanseker.com

При разработке приложений в Xamarin.Forms пользовательский интерфейс обычно разрабатывается в XAML, а взаимодействие обеспечивается фоновыми кодами. Однако это вызывает проблемы с обслуживанием и тестированием, когда приложение растет и становится сложным. Вы можете избежать этих проблем, создавая проекты с использованием модели MVVM (Model-View-ViewModel).

Эта модель отделяет бизнес- и презентационный уровни приложения от пользовательского интерфейса. Такое разделение помогает облегчить тестирование, сопровождение и разработку приложения. Естественно, это позволяет дизайнерам и разработчикам более слаженно сотрудничать.

Шаблон MVVM

Прежде всего, важно понять задачи компонентов и то, как они взаимодействуют друг с другом. Шаблон MVVM в Xamarin.Forms состоит из основных компонентов Model, View и ViewModel. Эти слои отделены друг от друга. Слой Model не знает слой ViewModel, а слой ViewModel не знает слой View. Таким образом, можно разрабатывать компоненты независимо друг от друга.

xamarin forms mvvm

MVVM (Model-View-ViewModel)

Модель (Model)

Модель – это невизуальные классы, которые содержат данные, которые будут использоваться в приложении. Класс модели не зависит от класса ViewModel. Примерами являются объекты передачи данных (DTO), простые старые объекты CLR (POCO).

Модель представления (ViewModel Xamarin.Forms)

Связывает данные между View и Model, выполняет команды и сообщает об изменениях, то есть действует как мост. ViewModel знает слой модели, но не слой View. ViewModel использует событие PropertyChanged при подключении данных и класс ObservableCollection для коллекций.

Представление (View)

Представление – это слой, на котором представлено изображение приложения, то есть расположены элементы пользовательского интерфейса. В идеале, создавайте представления с помощью XAML. Таким образом, вы примените принцип Separation of Concerns. В приложениях Xamarin.Forms представление обычно является производным от класса Page или ContentView. Чтобы взаимодействовать с элементом представления в представлении, например, щелкнуть, выбрать, определите метод команды в классе ViewModel и подключите его к компоненту представления.

Привязка ViewModel к представлению View

Класс ViewModel обычно привязывается к слою View декларативно и программно.

Декларативное связывание

Декларативное связывание – более простой метод. Это декларативное связывание модели представления с BindingContext представления в XAML.

<ContentPage ... xmlns:local="clr-namespace:eShop"> 
   <ContentPage.BindingContext> 
       <local:LoginViewModel /> 
   </ContentPage.BindingContext> 
</ContentPage>

При создании ContentPage автоматически создается экземпляр LoginViewModel и устанавливается в качестве BindingContext представления.

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

Создание модели представления программным путем

Класс ViewModel связывается со свойством BindingContext в классе xaml.cs представления. С помощью этого метода можно подключить параметризованные методы конструктора класса ViewModel.

public LoginView()  
{  
    InitializeComponent();  
    BindingContext = new LoginViewModel(navigationService);  
}

Обновление представления в ответ на изменения в MVVM

Классы ViewModel и Model, доступные через View, должны реализовать интерфейс INotifyPropertyChanged. Таким образом, когда основные свойства класса ViewModel или Model изменяются, то компоненты в представлении также изменяются. Всегда вызывайте событие PropertyChanged, когда значение свойства изменяется и его значения используются другими свойствами. Также никогда не вызывайте событие PropertyChanged, если значение свойства не меняется.

В приведенном ниже примере BaseViewModel реализует интерфейс INotifyPropertyChanged. Метод OnPropertyChanged проверяет и сообщает об изменениях.

    public class BaseViewModel : INotifyPropertyChanged
    {
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        public void OnPropertyChanged([CallerMemberName] string name = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
 
    }

Реализация команд

Команды – это примеры объектов, реализующих интерфейс ICommand. Используйте команды для взаимодействия с элементами пользовательского интерфейса в Xamarin.Forms. Чтобы добавить команды в представление, добавьте методы команд в класс ViewModel, а затем привяжите эти методы к компоненту представления.

Давайте посмотрим это на примере. Сначала мы определили метод команды с именем ShareCommand в классе ViewModel. Этот метод будет вызываться при щелчке на компоненте PancakeView в представлении.

public ICommand ShareCommand => new Command(() => Share.RequestAsync(selectedTrack.PreviewUrl));
 

Затем подключили метод команды, используя функцию TapGestureRecognizer компонента PancakeView. Таким образом, когда нажимаем на PancakeView, метод ShareCommand срабатывает.

<pv:PancakeView>
    <pv:PancakeView.GestureRecognizers>
        <TapGestureRecognizer Command="{Binding ShareCommand}"/>
    </pv:PancakeView.GestureRecognizers>
    <Image Source="share.png" HeightRequest="40" WidthRequest="40"/>
</pv:PancakeView>

Xamarin.Forms MVVM: преимущества паттерна

  • Принцип разделения ответственности (SoC): Модель MVVM позиционирует слои независимо друг от друга. Добавление новой модели не нарушает структуру проекта.
  • Позволяет разрабатывать отдельный код на каждом слое. Таким образом, Front-end и Back-end разработчики могут легко сотрудничать.
  • Простота сопровождения. Например, изменение, внесенное в класс Model, не влияет на представление.
  • Повышает тестируемость. Поскольку визуальный интерфейс и код отделены друг от друга, их легче тестировать.

Недостатки паттерна MVVM

В отличие от преимуществ, данная модель также имеет некоторые недостатки.

  • Увеличивается объем кода. Естественно, соединение слоев увеличивает объем кода.
  • Увеличивается потребление памяти.

Заключение

Подводя итоги, мы рассмотрели структуру и слои модели MVVM, затем соединительные слои, и, наконец, преимущества и недостатки. Следовательно, использование модели в проектах Xamarin.Forms облегчает сопровождение, тестирование и устойчивость. Более того, это значительно снижает сложность кода.

Материалы по теме