Ограничивает ли использование модели MVVM в WPF программиста от написания кода? Избегание кода позади приводит к множеству осложнений, но, с другой стороны, связанность становится проблемой. Так что же лучше?
MVVM ограничивает программный код?
Ответы (1)
Модель MVVM НЕ ограничивает вас в написании кода.
Что он продвигает, так это то, что View должен зависеть только от ViewModel (и ViewModel от модели).
Поэтому, если вы пишете код, который фактически реализует ViewModel, вы создаете зависимость от ViewModel к представлению.
Код, который ТОЛЬКО делает Просмотр связанных вещей, в порядке
Вещь, которую вы теряете при использовании кода, — это простое (модульное) тестирование этого кода.
ИЗМЕНИТЬ
Распространенным выражением в мире MVVM является «только XAML». Как бы мне ни нравилось короткое, резкое заявление, оно имеет тенденцию отвлекать от реальной проблемы, которую пытается решить MVVM, и от того, как он пытается ее решить.
Пока вы придерживаетесь того, чтобы сделать View зависимым от ViewModel, а ViewModel от модели И стремитесь к (модульной) тестируемости, вы на правильном пути.
ИЗМЕНИТЬ 2
При обработке представления событие должно делать только две вещи: изменять само представление или уведомлять ViewModel с помощью привязки о том, что что-то изменилось. Уведомление VIEW об изменении в ViewModel должно выполняться путем реализации INotifyPropertyChanged в ViewModel.
Аналогичным образом ViewModel может реагировать на события в представлении, связывая команды ViewModel с представлением.
Кнопка WPF имеет свойство Command, которое можно использовать. Он выполняется при нажатии кнопки.
Если элемент управления не имеет свойства Command или вы хотите выполнить команду при возникновении другого события, все, что вам нужно сделать, — это превратить событие в выполнение ICommand.
Microsoft уже предоставила реализацию этого в Blend SDK. Из этой статьи:
... xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity..."
<Slider
<i:Interaction.Triggers>
<i:EventTrigger EventName="ValueChanged">
<i:InvokeCommandAction Command="{Binding MyCommand}"
CommandParameter="{Binding Text, ElementName=textBox}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Slider>
И обсуждение команд и триггеров событий а>