MVVM ограничава Code Behind?

Използването на MVVM модел в WPF ограничава ли програмиста да пише код отзад? Избягването на Code back води до много усложнения, но от друга страна свързването възниква като проблем. И така, какво е по-добре?


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


Отговори (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>

И дискусия за команди срещу задействания на събития

person Emond Erno    schedule 28.05.2012
comment
Основната необходимост от използване на MVVM според мен е да се направят изгледите независими от действителното внедряване (модели на изгледи), но има сценарии, при които факторът на зависимост е толкова голям, че задният код е задължителен, напр. реализиране на събития. И ако се използва код отзад, тогава факторът на свързване може да бъде възпрепятстван, тъй като View може да стане донякъде стабилен. - person PhOeNiX; 28.05.2012
comment
@phoenix Това изглежда малко назад MVVM се използва за прекъсване на връзката между логиката на ViewModel и View, така че да можете да тествате ViewModel. Зависимостите трябва да съществуват в даден момент, в този модел изгледът зависи от ViewModel (или интерфейс на ViewModel). - person Adam Houldsworth; 28.05.2012
comment
При обработката на изглед дадено събитие трябва да прави само две неща: да промени самия изглед или да уведоми ViewModel с помощта на обвързване, че нещо се е променило. - person Emond Erno; 28.05.2012
comment
Уведомяването на View Model може да се извърши с помощта на INotifyPropertyChanged, но за събития като събития с щракване процедурата е малко подредена, когато не можете да имате манипулатор в кода си отзад в случай на MVVM. Поправи ме ако греша :) - person PhOeNiX; 28.05.2012
comment
Всичко, което трябва да направите, е да превърнете събитието в изпълнение на ICommand. Microsoft вече предостави имплементация на това в Blend SDK. Вижте blogs.msdn.com/b/luc/archive/2010/11/18/ и blog.tonysneed.com/2011/07/22/ - person Emond Erno; 28.05.2012
comment
Между другото WPF бутон има свойство Command, което вече прави това вместо вас. - person Emond Erno; 28.05.2012
comment
Добавих тези коментари към моя отговор.. момче, това се превръща в уики :) - person Emond Erno; 28.05.2012
comment
Свързването може да се извърши към бутон с помощта на DelegateCommand или ICommand, имам предвид събитие като MouseDouble_Click събитие. Ако това събитие може да бъде обвързано във VM den, моля, уведомете ме. :) - person PhOeNiX; 28.05.2012
comment
Да, може да се обвърже с помощта на поведението в първата статия, която споменах. - person Emond Erno; 28.05.2012
comment
Благодаря Erno... Ще прегледам статията и ще ви уведомя дали успях да постигна това, което исках. :) - person PhOeNiX; 28.05.2012
comment
Отличен отговор, +2, ако можех. - person slugster; 28.05.2012