Назад к вопросам
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>
*/