在WPF应用程序,方法中实现MVVM模式

时间:2017-11-01 00:33:40

标签: c# wpf mvvm view viewmodel

如何重构以下事件处理程序以适应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。

1 个答案:

答案 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模式之外,它们似乎没有任何好处......

好处是可以将应用程序逻辑(即单击元素时发生的情况)移动到它所属的视图模型。