Привязать событие управления ползунком - PullRequest
1 голос
/ 16 марта 2011

В представлении (AudioView.xaml) я написал следующий код

<Slider
    Name="AudioSlider"
    Width="200"
    Height="23"
    Grid.Column="0"
    IsSelectionRangeEnabled="True"
    IsSnapToTickEnabled="True"
    Maximum="{Binding Path=TotalAudioPlayingSeconds, Mode=OneTime}"
    Minimum="0"
    Style="{StaticResource CustomStyleForSlider}"
    Thumb.DragCompleted="{Binding AudioSliderChangedCommand}"
    TickFrequency="1"
    Value="{Binding Path=AudioPosition}"/>

Примечание: также есть файл AudioView.xaml.cs.

В классе модели представления (AudioViewModel.cs) я определил следующее свойство

public event DragCompletedEventHandler AudioSliderChangedCommand;

и в конструкторе класса модели представления ( AudioViewModel.cs )

this.AudioSliderChangedCommand = new DragCompletedEventHandler(OnAudioSliderChanged);

Во время компиляции я получаю следующую ошибку

Ошибка 8 DragCompleted = "{Binding AudioSliderChangedCommand}" не является действительный. {Binding AudioSliderChangedCommand} не является допустимым событием Имя метода обработчика. Только методы экземпляра в сгенерированном или класс code-behind действителен.

1 Ответ

6 голосов
/ 16 марта 2011

Проблема не в вашем коде, а в вашем 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.

Вот как будет работать выше:

  1. В вашем View,когда вызывается DragCompleted, будет вызываться метод View.DragCompletedEventHandler
  2. Этот метод получит событие 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();
}

Можно также вообще обойтись без какого-либо выделенного кода, используя некоторый видприкрепленное поведение «событие в команду».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...