2

我正在尝试在 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 代码崩溃

   在 GalaSoft.MvvmLight.Command.RelayCommand`1.CanExecute(对象参数)
   在 Telerik.Windows.Controls.RadMenuItem.CanExecuteApply() 在 c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 2105
   在 Telerik.Windows.Controls.RadMenuItem.ChangeCommand(ICommand oldCommand, ICommand newCommand) 在 c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 2124
   在 Telerik.Windows.Controls.RadMenuItem.OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 在 c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 1623
   在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   在 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   在 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs 参数)
   在 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,DependencyProperty dp,PropertyMetadata 元数据,EffectiveValueEntry oldEntry,EffectiveValueEntry& newEntry,布尔 coerceWithDeferredReference,布尔 coerceWithCurrentValue,OperationType operationType)

等等

如果我将参数更改为 RelayCommand <string> 而不是 RelayCommand <MessageTokens> 代码运行良好。

我不愿意这样做,因为我失去了强输入参数的所有好处。

我怀疑我没有在 XAML 中正确声明枚举。我试过了

  CommandParameter = "<fullpath>..MessageTokens.SupplierInvoice>"

但这会在 MVVMLight 中给出 InvalidCastException。

有没有人有什么建议?

非常感谢杰里米

用解决方案编辑

问题是因为我没有正确引用带有 + 号的 CommandParameter 绑定中的内部类。

正确的 XAML 应该是:

<Controls1:RadMenuItem Command="{Binding SalesInvoiceViewModel.OpenInvoiceWindowCommand}" CommandParameter="{x:Static local:DebitInvoiceViewModelBase+MessageTokens.SalesInvoice}" Header="Raise a sales invoice"/>
4

0 回答 0