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"/>
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top