Привязка Enum для MVVM Light RelayCommand CommandParameter
-
12-11-2019 - |
Вопрос
Я пытаюсь связать параметр команды в XAML для релайоммандгенагенеракодичевогоCode>, как показано ниже, где MessageTokens - это 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"/>
.
Использование RadgridView Telerik Код сбивает с помощью
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).
и т. д ..
Если я изменим параметр в реле в релайоммандгенаеракодицетагкоде> вместо релайомандгенагенеракодицетагкода> код работает нормально.
Я ненавижу это сделать, так как я теряю все преимущества сильно набрав мои параметры.
Я подозреваю, что я правильно объявляю Enum в XAML.Я пробовал
CommandParameter = "<fullpath>..MessageTokens.SupplierInvoice>"
.
Но это дает InvalidCastException в MVVMlight.
У кого-нибудь есть какие-то предложения?
Большое спасибо Джереми
отредактировано с решением
Проблема была, потому что я не был должным образом ссылаться на внутренний класс в привязке CommandParameter с знаком +.
Правильный XAML должен быть:
.<Controls1:RadMenuItem Command="{Binding SalesInvoiceViewModel.OpenInvoiceWindowCommand}" CommandParameter="{x:Static local:DebitInvoiceViewModelBase+MessageTokens.SalesInvoice}" Header="Raise a sales invoice"/>
Решение
Вы можете посмотреть на этот пост, объясняющий, как пройти значение enum в качестве командаParameter: пропускание значения enum в качестве параметра команды из XAML .