如何重构以下事件处理程序以适应ViewModel?
private void imgSkipBack_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
SetNewPlayerPosition(ViewModel.MovieElapsedTime.Subtract(Settings.SkipSeconds).TotalSeconds >= 0
? ViewModel.MovieElapsedTime.Subtract(Settings.SkipSeconds)
: new TimeSpan(0));
}
}
private void SetNewPlayerPosition(TimeSpan newPosition)
{
Player.Position = newPosition;
AlignTimersWithSource(Player.Position);
}
private void AlignTimersWithSource(TimeSpan currentPosition)
{
ViewModel.MovieLeftTime = Player.NaturalDuration.TimeSpan - currentPosition;
ViewModel.MovieElapsedTime = currentPosition;
}
vm声明如下:
public class VideoPlayerViewModel : ViewModelBase
{
private TimeSpan _movieElapsedTime = default(TimeSpan);
public TimeSpan MovieElapsedTime
{
get => _movieElapsedTime;
set
{
if (value != _movieElapsedTime)
{
_movieElapsedTime = value;
OnPropertyChanged();
}
}
}
private TimeSpan _movieLeftTime = default(TimeSpan);
public TimeSpan MovieLeftTime
{
get => _movieLeftTime;
set
{
if (value != _movieLeftTime)
{
_movieLeftTime = value;
OnPropertyChanged();
}
}
}
}
我尝试过使用命令,但除了实际遵循MVVM模式之外,它们似乎没有任何好处,这个版本实际上只在xaml中添加了额外的代码以允许我传递EventArgs
as CommandParameter。
答案 0 :(得分:1)
如何重构以下事件处理程序以适应ViewModel?
当引发元素的MouseLeftButtonDown
事件时,您可以使用交互触发器来调用命令:
<Image ...>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown" >
<i:InvokeCommandAction Command="{Binding YourCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Image>
您需要参考System.Windows.Interactivity。有关此问题的详细信息,请参阅以下博客文章:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/。
我尝试过使用命令,但除了实际遵循MVVM模式之外,它们似乎没有任何好处......
好处是可以将应用程序逻辑(即单击元素时发生的情况)移动到它所属的视图模型。