Използването на MVVM модел в WPF ограничава ли програмиста да пише код отзад? Избягването на Code back води до много усложнения, но от друга страна свързването възниква като проблем. И така, какво е по-добре?
MVVM ограничава Code Behind?
Отговори (1)
Моделът MVVM НЕ ви ограничава да пишете код отзад.
Това, което насърчава, е, че изгледът трябва да зависи само от ViewModel (и ViewModel от модела)
Така че, ако пишете код зад това, което всъщност внедрява ViewModel, вие създавате зависимост от ViewModel към View.
Кодът зад който прави САМО Преглед на свързани неща е ОК
Нещото, което губите, когато използвате код отзад, е лесното (единично) тестване на този код.
РЕДАКТИРАНЕ
Често срещан израз в света на MVVM е "само XAML". Колкото и да харесвам кратко, бързо изявление, то има тенденция да отклонява от действителния проблем, който MVVM се опитва да реши, и как се опитва да го реши.
Докато се придържате към това да направите View зависим от ViewModel и ViewModel от модела И се стремите към (единица)тестваемост, вие сте на прав път.
РЕДАКТИРАНЕ 2
При обработката на изглед дадено събитие трябва да прави само две неща: да промени самия изглед или да уведоми ViewModel с помощта на обвързване, че нещо се е променило. Уведомяването на VIEW за промяна в ViewModel трябва да се извърши чрез внедряване на INotifyPropertyChanged на ViewModel.
По подобен начин ViewModel може да реагира на събития в View чрез обвързване на ViewModel команди към View.
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>
И дискусия за команди срещу задействания на събития