Lier une énumération à MVVM Light RelayCommand CommandParamètre
-
12-11-2019 - |
Question
J'essaye de lier le paramètre de commande dans XAML pour un relayCommand<MessageTokens
> Comme ci-dessous, où Messagetokens est une enum
public ICommand OpenInvoiceWindowCommand
{
get
{
return _openInvoiceWindowCommand ??
(_openInvoiceWindowCommand = new RelayCommand<MessageTokens>(OpenInvoiceWindow, prm => CanExecuteOpenInvoiceWindowCommand));
}
}
Le XAML est:
<Controls1:RadMenuItem Command="{Binding SupplierInvoiceViewModel.OpenInvoiceWindowCommand}" CommandParameter="{Binding Source={x:Type ShipmentDetails:DebitInvoiceViewModelBase}, Path=MessageTokens.SupplierInvoice}" Header="Register a supplier's invoice"/>
Utilisation de RadgridView de Telerik Le code se bloque avec
at GalaSoft.MvvmLight.Command.RelayCommand`1.CanExecute(Object parameter) at Telerik.Windows.Controls.RadMenuItem.CanExecuteApply() in c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 2105 at Telerik.Windows.Controls.RadMenuItem.ChangeCommand(ICommand oldCommand, ICommand newCommand) in c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 2124 at Telerik.Windows.Controls.RadMenuItem.OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) in c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 1623 at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
etc.
Si je change le paramètre pour relayCommand<string
> au lieu de relaycommand<MessageTokens
> Le code fonctionne bien.
Je déteste le faire car je perds tous les avantages de taper fortement mes paramètres.
Je soupçonne que je ne déclare pas l'énumération correctement dans XAML. J'ai essayé
CommandParameter = "<fullpath>..MessageTokens.SupplierInvoice>"
Mais cela donne une invalidcastException dans MVVMlight.
Est-ce que quelqu'un a des suggestions?
Merci beaucoup Jeremy
Édité avec la solution
Le problème était parce que je ne faisais pas bien référence à la classe intérieure dans la liaison CommandParameter avec le signe +.
Le XAML correct doit être:
<Controls1:RadMenuItem Command="{Binding SalesInvoiceViewModel.OpenInvoiceWindowCommand}" CommandParameter="{x:Static local:DebitInvoiceViewModelBase+MessageTokens.SalesInvoice}" Header="Raise a sales invoice"/>
La solution
Vous pouvez faire un coup d'œil à cet article expliquant comment passer une valeur d'énumération en tant que CommandParameter: Passer une valeur d'énumération comme paramètre de commande de XAML.