Проблема не в вашем коде, а в вашем XAML.Где-то вы делаете это:
DragCompleted="{Binding AudioSliderChangedCommand}"
Это указывает десериализатору XAML подключить обработчик AudioSliderChangedCommand
к событию DragCompleted
.Однако AudioSliderChangedCommand
- это , а не метод с соответствующей сигнатурой (который может быть присоединен в качестве обработчика), и он не в вашем классе View.И, наконец, вы не можете использовать Binding
для обработчиков событий.
Чтобы решить эту проблему, самое простое решение - сделать это в вашем View
:
private void DragCompletedEventHandler(object sender, DragCompletedEventArgs e)
{
var viewModel = (YourViewModelType)this.DataContext;
viewModel.OnAudioSliderChanged(this, e);
}
, а также изменить
DragCompleted="{Binding AudioSliderChangedCommand}"
до
DragCompleted="DragCompletedEventHandler"
в вашем XAML.
Вот как будет работать выше:
- В вашем View,когда вызывается
DragCompleted
, будет вызываться метод View.DragCompletedEventHandler
- Этот метод получит событие
AudioSliderChangedCommand
(см. примечание ниже) из ViewModel и вызовет его, передав исходные аргументы события
Важное примечание
Вы, похоже, не понимаете события, обработчики событий и команды.Ваш код в его нынешнем виде вводит в заблуждение.AudioSliderChangedCommand
- это event
, но название предполагает, что это ICommand
.Соответствующее имя будет AudioSliderChanged
.
Кроме того, соответствующий способ MVVM сделать это - использовать некоторый вариант DelegateCommand
(у всех приличных сред MVVM есть один; я использовал имя класса для реализации вПризма).Затем, если предположить, что AudioSliderChangedCommand
действительно является командой, выделенный код в вашем представлении будет выглядеть так:
private void DragCompletedEventHandler(object sender, DragCompletedEventArgs e)
{
var viewModel = (YourViewModelType)this.DataContext;
viewModel.AudioSliderChangedCommand.Execute();
}
Можно также вообще обойтись без какого-либо выделенного кода, используя некоторый видприкрепленное поведение «событие в команду».