Prism EventToCommand DependencyObject ou FrameworkElement On en est où ?

Oui c'est curieux, un élément essentiel du modèle MVVM n'existe pas encore dans Prism l'EventToCommand.

Comment Binder une commande du ViewModel directement sur un element de la View sans code behind. Posé ainsi le problème à l'air simple mais comme ce n'est pas supporté dans Prism alors chacun doit utiliser son petit bout de code.

CodePlex Patterns & Practices EventToCommand
Discussion dans CodePlex à ce propos.

Suggestion du Pattern & Practices
InvokeCommandAction qui se trouve Microsoft.Practices.Prism.Interactivity ... n'est pas encore documenté !

Oct 2016 : Whaou, je suis de retour aux affaires avec WPF-MVVM et je suis surpris de voir à quel point cet article à encore cours...

Solutions dans les différents frameworks MVVM

GalaSoft :

\\mvvmlight_0f4486b50609\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras (NET4)\Command\EventToCommandVS10.cs
public class EventToCommand : TriggerAction<DependencyObject>
à croire que Laurent Bugnion à développe MVVMLight en fonction des versions de Visual Studio ... Mais en tous cas c'est toujours Light ;)

Oct 2016 : On trouvera maintenant un NuGet : MVVLight 5.3.0

Cinch :

\\cinch-70832\cinch\V2 (VS2010 WPF and SL)\CinchV2\Commands
EventToCommandArgs.cs
SimpleCommand.cs
WeakEventHandlerManager.cs
Et en y regardant de plus prêt les commandes utilisée pour Binder directement dans la View sont :
\\cinch-70832\cinch\V2 (VS2010 WPF and SL)\CinchV2\Interactivity\
\\Actions\CommandDrivenGoToStateAction.cs
\\Triggers\EventToCommandTrigger.cs
public class EventToCommandTrigger : TriggerAction<FrameworkElement>\\Triggers\CompletedAwareCommandTrigger.cs
public class CompletedAwareCommandTrigger : TriggerBase<FrameworkElement>\\Triggers\CompletedAwareGotoStateCommandTrigger.cs

Dans la View \\cinch-70832\cinch\V2 (VS2010 WPF and SL)\WPF_Demo\CinchV2DemoWPF\Views\ImageLoaderView.xaml :
<UserControl
      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
      xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

<Grid x:Name="mainGrid" >
        <i:Interaction.Triggers>
            <CinchV2:CompletedAwareCommandTrigger
                         Command="{Binding ShowActionsCommandReversed}">
                <ei:GoToStateAction StateName="ShowActionsState"/>
            </CinchV2:CompletedAwareCommandTrigger>
        </i:Interaction.Triggers>

Dans le ViewModel \\cinch-70832\cinch\V2 (VS2010 WPF and SL)\WPF_Demo\CinchV2DemoWPF\ViewModels\ImageLoaderViewModel.cs :
public class ImageLoaderViewModel : ViewModelBase
{
public ImageLoaderViewModel(
            IMessageBoxService messageBoxService,
            IOpenFileService openFileService,
            ISaveFileService saveFileService,
            IUIVisualizerService uiVisualizerService,
            IImageProvider imageProvider,
            IImageDiskOperations imageDiskOperations,
            IViewAwareStatus viewAwareStatusService)
        {
             ShowActionsCommandReversed = new SimpleCommand<Object, Object>((input) => { });

public SimpleCommand<Object, Object> ShowActionsCommandReversed { get; private set; }

Oct 2016 : On trouvera maintenant un NuGet de Sacha Barber

Cinch is a Rich Full Featured WPF/SL MVVM Framework 2.0.70832

Advanced MVVM

Oct 2016 - De retour aux affaires avec WPF
Il me faut encore absolument citer Josh Smith car c'est le framework qui est souvent implanté et choisi par les développeurs.

Advanced MVVM

Et un NuGet : Ici

WPF RealTime Application d'Alexis Shelest :

\\Src\Framework\WPF.RealTime.Infrastructure\AttachedCommand\EventToCommandArgs.cs
Indentique à Cinch
\\Src\Framework\WPF.RealTime.Infrastructure\AttachedCommand\EventToCommandTrigger.cs
Plus évolué que dans Cinch
\\Src\Framework\WPF.RealTime.Infrastructure\Commands\SimpleCommand.cs
Indentique à Cinch
Je dirais bien qu'Alexis Shelest à simplifié ce qu'il a trouvé dans Cinch. Il est vrai que ce que l'on trouve dans CinchV2 est peut être un peu compliqué.

WPF/MVVM Real-Time Trading Application

CodePlex

Conclusion sur le Command Binding

Finalement le Command Binding n'est pas un problème aussi simple qu'il n'y parait, avec des problématiques de se câbler à un niveau si bas du framework que d'attaqué directement System.Windows.Interactivity et pour d'autres farfelus d'attaquer Microsoft.Practices.Prism.Interactivity InvokeCommand !.

Notons au passage les évolutions effectuées par Laurent Bugnion dans MVVMLight qui utilise maintenant System.WeakReference pour éviter les fuites mémoire.

La solution est certainement d'utiliser maintenant le module : Microsoft.Practices.Prism.Commands dont voici une partie de l'interface :

Prism v4.1 les DelegateCommand solution du Command Binding, mais je ne suis pas sûr !
Je crois que le plus surprenant c'est que tous ces objets sont basé sur :
System.Windows.Interactivity.dll qui n'est même pas dans le .NET Framework 4.0 ... Il existe donc plusieurs version de cette DLL soit pour Blend soit pour Silverlight ou bien encore WPF.

On en trouvera un exemplaire de cette DLL dans le Microsoft SDKs au fond du répertoire :
C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries

EventToCommand InvokeCommandAction La Solution ?!







Aucun commentaire:

Publier un commentaire

Pour plus d'interactivité, n'hésitez pas à laisser votre commentaire.