Pergunta

Eu estou tentando vincular o parâmetro de comando em XAML para um RelayCommand<MessageTokens> como abaixo, onde MessageTokens é um enum

 public ICommand OpenInvoiceWindowCommand
        {
            get
            {
                return _openInvoiceWindowCommand ??
                       (_openInvoiceWindowCommand = new RelayCommand<MessageTokens>(OpenInvoiceWindow, prm => CanExecuteOpenInvoiceWindowCommand));
            }
        }

O XAML é:

  <Controls1:RadMenuItem Command="{Binding SupplierInvoiceViewModel.OpenInvoiceWindowCommand}" CommandParameter="{Binding Source={x:Type ShipmentDetails:DebitInvoiceViewModelBase}, Path=MessageTokens.SupplierInvoice}" Header="Register a supplier's invoice"/>

Usando Telerik do RadGridView o código de falha com

   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)

etc.

Se eu alterar o parâmetro para RelayCommand<string> em vez de RelayCommand<MessageTokens> o código é executado correctamente.

Eu sou detesta fazer isso desde que eu perder todos os benefícios de fortemente a escrever meus parâmetros.

Eu suspeito que eu não estou declarando o enum corretamente em XAML.Eu tentei

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

mas o que dá uma InvalidCastException em MVVMLight.

Alguém tem alguma sugestão?

Muito obrigado Jeremy

Editado com a solução

O problema era porque eu não estava referindo-se corretamente para o interior de classe no CommandParameter ligação com o sinal de+.

o XAML correto deve ser:

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

Solução

Você pode wnat para dar uma olhada neste post explicando como passar um valor de enumeração como um commandparameter: Passar um valor de enumeração como parâmetro de comando do XAML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top