/ / Какъв е приетия модел за командване на WPF в MVVM? - wpf, mvvm, команда, командна схема

Какъв е приет модел за командир на WPF в MVVM? - wpf, mvvm, команда, команден модел

Работя върху WPF приложение и разбирам товакомандния модел доста добре, но открих, че има няколко различни реализации на командния модел за MVVM. Има реализация на Джош Смит в неговото примерно приложение за WPF, DelegateCommand от Призма и CommandBindings изпълнение.

Въпросът ми е каква е общоприетата най-добра практика за използване на команди с MVVM? Приложението ми използва Prism така DelegateCommand е на разположение при нас.

Разговорниците в моя екип спорят кой подход е "най-добрият". Някои не харесват многобройните .cs файлове, генерирани за всяка команда, други предпочитат всичко да се свързва чрез CommandBindings, Загубен съм. Може ли някой да хвърли малко светлина?

Отговори:

2 за отговор № 1

Две точки, които трябва да вземете предвид:

Командите, предоставени от различни MVVMрамки, като CommandSinkCommand или SimpleCommand (от Cinch) и т.н., работят както обичайните ICommands. По-специално, манипулаторът на CanExecute се оценява винаги, когато WPF вярва, че се е случило нещо, което може да причини промяна на потребителския интерфейс. Можете също така ръчно да принудите това CommandManager.InvalidateRequerySuggested().

За разлика от това, DelegateCommands <> от Prism не извикват обработващия CanExecute, освен ако ръчно не се обадите RaiseCanExecuteChanged() по командата. Ако искате да промените това, така че той също да бъде освободен, когато командите обикновено се изискват, вижте кода на http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

РЕДАКТИРАНЕ:

Втора точка: Командите на MVVM рамки обикновено приемат обект като параметър на командата. За разлика от тях, DelegateCommands <> от Prism са по-силно набрани (въпреки че, разбира се, можете да имате DelegateCommands, ако искате).


3 за отговор № 2

Е - мисля, че няма "т на решение.

Командните връзки не са тестируеми толкова лесно и въвеждат зависимост от WPF класовете в ViewModel, което не е много добро. Така че не бих ги използвал.

Както DelegateCommand, така и CommandSinkCommand (ДжошРешението на Смит са добри начини за IMO. Те всъщност не са различни и никой от тях не превъзхожда другия. Въпреки че забелязах, че версията на CommandSink не работи винаги, когато маршрутизирането на командите става по-сложно (особено когато участват DataTemplates).

Можете дори да ги комбинирате: Използвайте DelegateCommand и допълнително използвайте версията на JoshSmith - така че можете да комбинирате предимствата и на двете. Единственото, от което се нуждаете, са някои помощни класове - всъщност не е трудно за изпълнение.

Много по-важна е последователността в молбата ви: Ако сте решили какво искате да използвате, трябва да следвате този път през цялото си приложение.