MVVM ограничивает программный код?

Ограничивает ли использование модели MVVM в WPF программиста от написания кода? Избегание кода позади приводит к множеству осложнений, но, с другой стороны, связанность становится проблемой. Так что же лучше?


person PhOeNiX    schedule 28.05.2012    source источник


Ответы (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>

И обсуждение команд и триггеров событий

person Emond Erno    schedule 28.05.2012
comment
По моему мнению, основная потребность в использовании MVVM заключается в том, чтобы сделать представления независимыми от фактической реализации (моделей представлений), но есть сценарии, в которых фактор зависимости настолько велик, что код позади является обязательным, например. реализующие мероприятия. И если используется код позади, то коэффициент связи может быть затруднен, поскольку представление может стать несколько надежным. - person PhOeNiX; 28.05.2012
comment
@phoenix Это кажется немного обратным. MVVM используется для отключения логики ViewModel от View, чтобы вы могли протестировать ViewModel. Зависимости должны существовать в какой-то момент, в этом шаблоне представление зависит от модели представления (или интерфейса модели представления). - person Adam Houldsworth; 28.05.2012
comment
При обработке представления событие должно делать только две вещи: изменять само представление или уведомлять ViewModel с помощью привязки о том, что что-то изменилось. - person Emond Erno; 28.05.2012
comment
Уведомление модели представления может быть выполнено с помощью INotifyPropertyChanged, но для таких событий, как события щелчка, процедура немного утомительна, поскольку в случае MVVM у вас не может быть обработчика в вашем коде. Поправьте меня, если я ошибаюсь :) - person PhOeNiX; 28.05.2012
comment
Кстати, кнопка WPF имеет свойство Command, которое уже делает это за вас. - person Emond Erno; 28.05.2012
comment
Я добавил эти комментарии к своему ответу .. мальчик, это превращается в вики :) - person Emond Erno; 28.05.2012
comment
Привязку к кнопке можно сделать с помощью DelegateCommand или ICommand, я говорю о таком событии, как событие MouseDouble_Click. Если это событие может быть привязано к виртуальной машине, сообщите мне об этом. :) - person PhOeNiX; 28.05.2012
comment
Да, его можно связать, используя поведение, описанное в первой упомянутой мной статье. - person Emond Erno; 28.05.2012
comment
Спасибо, Эрно... Я просмотрю статью и дам вам знать, удалось ли мне добиться того, чего я хотел. :) - person PhOeNiX; 28.05.2012
comment
Отличный ответ, +2, если бы я мог. - person slugster; 28.05.2012