Проблема EventToCommand в MVVM Light - PullRequest
       15

Проблема EventToCommand в MVVM Light

0 голосов
/ 01 февраля 2012

У меня есть следующее визуальное дерево, для которого я пытаюсь отправить команду через EventToCommand.Визуальное изображение выглядит следующим образом:

<Border Background="Gray" Grid.Row="0" Margin="2" VerticalAlignment="Bottom">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDown">
                    <cmd:EventToCommand  
                Command="{Binding ShowVideosCmd}" 
                PassEventArgsToCommand="True" 
                CommandParameter="{Binding Videos}">
                    </cmd:EventToCommand>

                </i:EventTrigger>
            </i:Interaction.Triggers>
 </Border>

При нажатии на границу, к которой прикреплена команда, я получаю следующее всплывающее сообщение об ошибке:

"Необработанное исключение типа 'Система.InvalidCastException 'произошло в GalaSoft.MvvmLight.WPF4.dll

Дополнительная информация: Невозможно привести объект типа' System.Windows.Input.MouseButtonEventArgs 'к типу' System.Windows.DependencyObject '. "

Моя команда затем создается в viemModel следующим образом:

 ShowVideosCmd = new RelayCommand<DependencyObject>(
     (dpObj) =>
            { 
                 messenger.Default.Send<string>("ShowVideos");
            },
     (dpObj) => true
 );

Что я сделал не так?

1 Ответ

4 голосов
/ 01 февраля 2012

Сообщение об ошибке самоочевидно: у вас RelayCommand<DependencyObject> вы ожидали параметр команды как DependencyObject, но у вас есть MouseButtonEventArgs, что нормально, потому что вы подписались на MouseDown событие.

EventToCommand при возникновении события выполняет команду с одним из следующих параметров:

  • Если значение CommandParameter равно НЕ null, оно использует его в качестве параметра, поэтому команда должна выглядеть следующим образом: RelayCommand<typeOfTheSpecifiedCommandPameter>
  • Если PassEventArgsToCommand='true' и , то значение CommandParameter is null он использует eventargs в качестве команды параметр. Таким образом, вы должны определить свою команду как RelayCommand<MouseButtonEventArgs>.
  • Если PassEventArgsToCommand='false' и , CommandParameter равен null, он не выполняет команду вообще.

Примечание:

Так что вам нужно по-разному определять вашу команду для двух случаев. При необходимости вы должны использовать RelayCommand<object> и проверить тип параметра. Вот почему я считаю плохой практикой одновременно использовать PassEventArgsToCommand и CommandParameter.

Вернуться к исключению:

В вашем случае он показывает CommandParameter="{Binding Videos}", возвращает ноль, поэтому вы получаете MouseButtonEventArgs в качестве параметра команды.

Чтобы выяснить, почему {Binding Videos} является нулем, вы можете проверить окно вывода в VS во время выполнения на наличие ошибок привязки.

...