Назад к вопросам
Middle
166
questionbank

Что такое паттерн MVVM?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

  • Model: Представляет бизнес-логику и данные приложения. Модель не знает о View и ViewModel.
  • View: Представляет пользовательский интерфейс. Отображает данные из ViewModel и передает действия пользователя к ViewModel. View не содержит логики работы с данными или принятия решений.
  • ViewModel: Действует как посредник между Model и View. Предоставляет данные из Model в удобном для View формате и обрабатывает команды от View. ViewModel инкапсулирует логику представления и не имеет прямой ссылки на View.

Ключевые принципы MVVM:

  • Разделение ответственности (Separation of Concerns): Каждый уровень имеет свою четкую роль.
  • Data Binding: View связывается с ViewModel через привязки данных, что позволяет View автоматически обновляться при изменении данных в ViewModel и наоборот.
  • Commands: Действия пользователя во View (например, нажатие кнопки) передаются в ViewModel через команды, что обеспечивает слабую связанность между View и ViewModel.
  • Observable Collections: Для коллекций данных, которые должны быть обновлены в View при изменении, используются ObservableCollection.

Преимущества MVVM:

  • Улучшенная тестируемость (ViewModel легко тестируется без UI).
  • Упрощенная разработка UI (дизайнер может работать над View независимо от логики ViewModel).
  • Лучшая поддерживаемость кода.
  • Повторное использование ViewModel между различными View (например, для мобильных и настольных приложений).

Пример структуры:

// Model
public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// ViewModel
using System.ComponentModel; // Для INotifyPropertyChanged
using System.Runtime.CompilerServices; // Для CallerMemberName

public class UserViewModel : INotifyPropertyChanged
{
    private User _user;

    public UserViewModel(User user)
    {
        _user = user;
    }

    public string Name
    {
        get { return _user.Name; }
        set
        {
            if (_user.Name != value)
            {
                _user.Name = value;
                OnPropertyChanged(); // Уведомление View об изменении
            }
        }
    }

    public int Age
    {
        get { return _user.Age; }
        set
        {
            if (_user.Age != value)
            {
                _user.Age = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

// View (XAML в WPF)
/*
<StackPanel DataContext="{Binding}"> <!-- Привязка к ViewModel -->
    <TextBlock Text="{Binding Name}" />
    <TextBox Text="{Binding Name, Mode=TwoWay}" /> <!-- Двусторонняя привязка -->
    <TextBlock Text="{Binding Age}" />
    <TextBox Text="{Binding Age, Mode=TwoWay}" />
</StackPanel>
*/