Я пытаюсь связать параметр команды в XAML для RelayCommand <MessageTokens
>, как показано ниже, где MessageTokens - это перечисление
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"/>
При использовании Telerik RadGridView код вылетает с
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)
и т.д.
Если я изменяю параметр на RelayCommand <string
> вместо RelayCommand <MessageTokens
>, код работает нормально.
Я не хочу этого делать, потому что теряю все преимущества строгой настройки моих параметров.
Я подозреваю, что не правильно объявляю 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"/>