2

以下のように、RelayCommand の XAML でコマンド パラメーターをバインドしようとして<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(オブジェクト パラメーター) で
   c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 2105 の Telerik.Windows.Controls.RadMenuItem.CanExecuteApply() で
   c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 2124 の Telerik.Windows.Controls.RadMenuItem.ChangeCommand(ICommand oldCommand, ICommand newCommand) で
   c:\Builds\WPF_Scrum\HotFix_2010_Q3\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 1623 の Telerik.Windows.Controls.RadMenuItem.OnCommandChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) で
   System.Windows.DependencyObject.OnPropertyChanged (DependencyPropertyChangedEventArgs e) で
   System.Windows.FrameworkElement.OnPropertyChanged (DependencyPropertyChangedEventArgs e) で
   System.Windows.DependencyObject.NotifyPropertyChange (DependencyPropertyChangedEventArgs args) で
   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