【问题标题】:Bind an event of a slider control绑定滑块控件的事件
【发布时间】:2011-03-16 11:46:20
【问题描述】:

在视图中(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} 不是有效事件 处理程序方法名称。仅生成的实例方法或 代码隐藏类是有效的。

【问题讨论】:

  • 为什么这被称为计算机科学?我在问题中看不到任何与 CS 理论相关的内容。

标签: wpf xaml mvvm binding


【解决方案1】:

问题不在于您的代码隐藏,而在于您的 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. 在您的视图中,当DragCompleted 被引发时,方法View.DragCompletedEventHandler 将被调用
  2. 此方法将从 ViewModel 获取 AudioSliderChangedCommand 事件(请参阅下面的注释)并引发它,并传递原始事件参数

重要提示

您似乎对事件、事件处理程序和命令感到困惑。您的代码具有误导性。 AudioSliderChangedCommandevent,但顾名思义,它是 ICommand。适当的名称是AudioSliderChanged

另外,适当的 MVVM 方法是使用某种风格的 DelegateCommand(所有体面的 MVVM 框架都有一个;我在 Prism 中使用类名来实现)。然后,假设 AudioSliderChangedCommand 确实是一个命令,您的视图中的代码隐藏将是:

private void DragCompletedEventHandler(object sender, DragCompletedEventArgs e)
{
    var viewModel = (YourViewModelType)this.DataContext;
    viewModel.AudioSliderChangedCommand.Execute();
}

通过使用某种“事件到命令”附加行为,也可以完全不使用任何代码隐藏。

【讨论】:

  • The event AudioViewModel.AudioSliderChangedCommand' can only appear on the left hand side of += or -= (except when used from within the type
  • @Sreeju:这是我的代码中的错误,抱歉。现在修好了。您需要公开 OnAudioSliderChanged 方法。
  • 下面的代码写在AudioView.xaml.cs \n private void DragCompletedEventHandler(object sender, DragCompletedEventArgs e) { var viewModel = (YourViewModelType)this.DataContext; viewModel.AudioSliderChangedCommand.Execute(); }
  • 我们使用的是棱镜拱门。你能建议我如何使用 DelegateCommand 来做到这一点
  • OnAudioSliderChanged 已经公开。同样的错误即将来临:(
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多