我有一个 PlayerV.xaml 视图,里面有一个滑块:
<Slider Value="{Binding CurrentProgress}"/>
有一个按钮:
<Button Content="next song" Command="{Binding playNext}"/>
按钮工作正常。按钮的 playNext 命令包含在 PlayerVM.cs 中
我希望slider的ValueChanged调用存储在 PlayerVM.cs 中的函数:
[1]:<Slider Value="{Binding CurrentProgress}" ValueChanged="{Binding playNext}"/>
我知道[1]有一个不正确的语法,我使用它是为了解释清楚。
我知道我可以写:
<Slider ValueChanged="Slider_ValueChanged" Value="{Binding CurrentProgress}" />
在 * PlayerV.xaml.cs * 中,
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
//some logic (actions)
}
}
但我不想有任何逻辑。我希望它在 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();
}
3条答案
按热度按时间q9rjltbz1#
你有两个选择首先,尽管你说过不想使用代码隐藏,但一个解决方案就是这样做。在
ValueChanged
事件处理程序中,当值发生变化时,您可以简单地调用视图模型方法:我之所以提供这个解决方案,是因为我怀疑您是MVVM的新手,并且仍然认为不允许使用后面的代码。事实上,根本不是这样的,对于像这样纯粹的UI问题,这是一个很好的地方。
另一种选择是直接将属性数据绑定到
Slider.Value
。随着Slider
值的改变,属性也会改变。因此,您可以简单地从数据绑定属性setter调用方法:另一个选项涉及在自定义附加属性中处理
ValueChanged
事件。这个解决方案比其他的解决方案要多一点,所以我宁愿引导你去看我已经为其他问题写过的答案,而不是重新写一遍。请参阅我对如何使用MVVM将焦点设置为WPF控件的回答?和WPF C# -通过绑定问题在鼠标点击上导航WebBrowser,以获得此方法的解释和代码示例。h22fl7wq2#
通过使用事件来推荐逻辑,您可以将事件绑定到视图模型,但您需要帮助。您需要使用System.Windows.Interactivity库空间中的函数并包含MVVM Light(可能有其他MVVM库具有该功能,但我使用MVVM Light)。
标签:Is it possible to bind a WPF Event to MVVM ViewModel command?
vlju58qv3#
还有一个选择您可以制作自己版本的Slider控件,当用户与它交互时可以执行命令。
一个不完美但可以工作的代码可能看起来像这样:
然后你可以这样使用这个:
我还建议添加一些去抖动功能,因为在拖动滑块的手柄时,该命令将被执行数十次。