如何在视图模型中处理Slider.ValueChanged事件?

bar*_*art 2 c# wpf xaml mvvm

我有一个带有滑块的PlayerV.xaml视图:

<Slider Value="{Binding CurrentProgress}"/>
Run Code Online (Sandbox Code Playgroud)

并有一个按钮:

<Button Content="next song" Command="{Binding playNext}"/>
Run Code Online (Sandbox Code Playgroud)

按钮工作正常.Button的playNext命令包含在PlayerVM.cs中

我想让slider的ValueChanged调用一个存储在PlayerVM.cs中的函数:

[1]:<Slider Value="{Binding CurrentProgress}" ValueChanged="{Binding playNext}"/>

我知道[1]语法不正确,为了清楚起见,我使用了它.

====附加说明====

我知道我可以写:

<Slider ValueChanged="Slider_ValueChanged" Value="{Binding CurrentProgress}" />
Run Code Online (Sandbox Code Playgroud)

PlayerV.xaml.cs中会有

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        //some logic (actions) 
    }    
}
Run Code Online (Sandbox Code Playgroud)

但我不想在那里有任何逻辑.我希望它在PlayerVM.cs中(如按钮的命令处理函数).怎么做?我的App.xaml.cs启动函数也是:

private void OnStartup(object sender, StartupEventArgs e)
{
    MainWindow _mainWindow = new MainWindow();
    PlayerVM playerVM = new PlayerVM();
    _mainWindow.DataContext = playerVM;
    _mainWindow.Show();
 }
Run Code Online (Sandbox Code Playgroud)

She*_*dan 13

你有两个选择.首先,尽管您所说的不想使用代码,但一个解决方案就是让您做到这一点.在ValueChanged事件处理程序中,只要更改值,就可以调用视图模型方法:

private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    Slider slider = sender as Slider;
    PlayerVM viewModel = (PlayerVM)DataContext;
    viewModel.YourMethod(slider.Value);
} 
Run Code Online (Sandbox Code Playgroud)

我提供了这个解决方案,因为我怀疑你是MVVM的新手,并且仍然认为你不允许使用后面的代码.事实上,情况并非如此,对于纯粹的UI问题,例如,这是一个很好的地方.

另一种选择是将数据直接绑定到属性Slider.Value.随着Slider价值的变化,物业也将如此.因此,您只需从数据绑定属性设置器中调用您的方法:

public double CurrentProgress
{
    get { return currentProgress; }
    set
    {
        currentProgress = value;
        NotifyPropertyChanged("CurrentProgress");
        YourMethod(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个选项涉及ValueChanged在自定义附加属性中处理事件.这个解决方案比其他解决方案还要多一点,所以我更倾向于指导你为其他问题编写的一些答案,而不是重新编写它.请参阅我如何使用MVVM将焦点设置为WPF控件的答案WPF C# - 鼠标点击导航WebBrowser通过Binding问题解释此方法的解释和代码示例.