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.cspublic 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\CommandsEventToCommandArgs.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
{
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 WPFIl 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.csIndentique à 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 ! |
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:
Enregistrer un commentaire
Pour plus d'interactivité, n'hésitez pas à laisser votre commentaire.