我有一个带有滑块的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问题解释此方法的解释和代码示例.
| 归档时间: |
|
| 查看次数: |
13132 次 |
| 最近记录: |