В статье Приложения WPF с шаблоном проектирования Model-View-ViewModel автор, который является Джошем Смитом, сказал:
(1) В хорошо спроектированной архитектуре MVVM код для большинства представлений должен быть пустым или, самое большее, содержать только код, который управляет элементами управления и ресурсами, содержащимися в этом представлении. (2) Иногда также необходимо написать код в представлении CodeBehind, который взаимодействует с объектом ViewModel, например, при подключении события или вызове метода, который в противном случае было бы очень сложно вызвать из самого ViewModel.
Мой вопрос в том, что (1) почему пустая кодовая игра рассматривается как хорошо спроектированный MVVM. (Звучит так, что пустая кодовая строка всегда хороша.)
EDIT: мой вопрос заключается в следующем: почему подход, подобный AttachedCommandBehavior
или InvokeCommandAction
, пытается избежать кодирования кода.
Позвольте мне объяснить более подробно.
Что касается вопроса (1), я бы подумал о следующей ситуации, как из AttachedCommandBehavior. Поскольку Border не реализует ICommandSource
для MouseRightButtonDown
, вы не можете обычно связывать событие и ICommand
, но можете делать с AttachedCommandBehavior.
<!-- I modified some code from the AttachedCommandBehavior to show more simply -->
<Border>
<local:CommandBehaviorCollection.Behaviors>
<local:BehaviorBinding Event="MouseRightButtonDown"
Command="{Binding SomeCommand}"
CommandParameter="A Command on MouseRightButtonDown"/>
</local:CommandBehaviorCollection.Behaviors>
</Border>
ИЛИ
Мы можем сделать это с помощью System.Windows.Interactivity.InvokeCommandAction
.
<Border xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseRightButtonDown">
<i:InvokeCommandAction Command="{Binding SomeCommand}"
CommandParameter="A Command on MouseRightButtonDown"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Border>
НО,
Мы используем следующий XAML и его код, имеющий метод Border_MouseRightButtonDown
, который связан с указанным выше (2) Джошем Симтом.
<Border MouseRightButtonDown ="Border_MouseRightButtonDown"/>
Я думаю, что использование codebehind, как указано выше, неплохо просто потому, что разница между ними заключается только в том, где привязка команды или добавления обработчика событий.
Что вы думаете об этом?