Legatura di un enum a mvvm luce relycommand commandpameter
-
12-11-2019 - |
Domanda
Sto cercando di associare il parametro di comando in XAML per un relycommand<MessageTokens
> come di seguito, dove MessageTokens è un enum
public ICommand OpenInvoiceWindowCommand
{
get
{
return _openInvoiceWindowCommand ??
(_openInvoiceWindowCommand = new RelayCommand<MessageTokens>(OpenInvoiceWindow, prm => CanExecuteOpenInvoiceWindowCommand));
}
}
.
XAML è:
<Controls1:RadMenuItem Command="{Binding SupplierInvoiceViewModel.OpenInvoiceWindowCommand}" CommandParameter="{Binding Source={x:Type ShipmentDetails:DebitInvoiceViewModelBase}, Path=MessageTokens.SupplierInvoice}" Header="Register a supplier's invoice"/>
.
Utilizzo del radgridView di Telerik Il codice si blocca con
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).
ecc.
Se modifico il parametro su relaycommand<string
> invece di relycommand<MessageTokens
> il codice funziona bene.
Sono detestato per farlo da quando perdo tutti i vantaggi di digitare fortemente i miei parametri.
Sospetto che non sto dichiarando correttamente l'enum in XAML.Ho provato
CommandParameter = "<fullpath>..MessageTokens.SupplierInvoice>"
.
Ma questo dà un'invalidcastexception in mvvvmlight.
Qualcuno ha qualche suggerimento?
Molte grazie Jeremy
.Modificato con la soluzione
Il problema era perché non stavo facendo riferimento correttamente alla classe interna nel commandpameter vincolante con il segno +.
La corretta XAML dovrebbe essere:
.<Controls1:RadMenuItem Command="{Binding SalesInvoiceViewModel.OpenInvoiceWindowCommand}" CommandParameter="{x:Static local:DebitInvoiceViewModelBase+MessageTokens.SalesInvoice}" Header="Raise a sales invoice"/>
Soluzione
È possibile dare un'occhiata a questo post che spiega come passare un valore Enum come un comandoPaameter: Passando un valore Enum come parametro di comando da XAML .