gpt4 book ai didi

wpf - 绑定(bind) slider 控件的事件

转载 作者:行者123 更新时间:2023-12-03 10:20:40 27 4
gpt4 key购买 nike

在 View (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 .

在 View 模型类( AudioViewModel.cs)中,我定义了以下属性
public event DragCompletedEventHandler AudioSliderChangedCommand;

并在 View 模型类的构造函数中( AudioViewModel.cs )
this.AudioSliderChangedCommand = new DragCompletedEventHandler(OnAudioSliderChanged);

在编译期间,我收到以下错误

Error 8 DragCompleted="{Binding AudioSliderChangedCommand}" is not valid. {Binding AudioSliderChangedCommand} is not a valid event handler method name. Only instance methods on the generated or code-behind class are valid.

最佳答案

问题不在于您的代码隐藏,而在于您的 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 中。

这就是上面的工作方式:
  • 在您看来,当 DragCompleted提出,方法View.DragCompletedEventHandler将被称为
  • 此方法将获取 AudioSliderChangedCommand来自 ViewModel 的事件(见下面的注释)并引发它,传递原始事件 args

  • 重要提示

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

    此外,适当的 MVVM 方法是使用 DelegateCommand 的一些风格。 (所有体面的 MVVM 框架都有一个;我在 Prism 中使用类名来实现)。然后,假设 AudioSliderChangedCommand确实是一个命令,您的 View 中的代码隐藏将是:
    private void DragCompletedEventHandler(object sender, DragCompletedEventArgs e)
    {
    var viewModel = (YourViewModelType)this.DataContext;
    viewModel.AudioSliderChangedCommand.Execute();
    }

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

    关于wpf - 绑定(bind) slider 控件的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5324758/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com