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

9 浏览
0 Comments

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

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

0
0 Comments

问题的原因是作者想要将一个事件处理程序重构到ViewModel中,但不清楚如何实现。解决方法是使用交互触发器来调用命令,在元素的MouseLeftButtonDown事件被触发时执行命令。需要引用System.Windows.Interactivity库。通过在XAML中使用标签和标签来实现。

下一个问题是命令实际上是如何实现的。回答是通过在命令的Execute方法中调用SetNewPlayerPosition方法。这样可以将应用程序逻辑移动到ViewModel中。

另一个问题是如何将MediaElement Player移动到ViewModel中。回答是通过实现一个接口,然后在ViewModel中通过接口的属性来操作Player。

这篇文章介绍了在WPF应用程序中实现MVVM模式的方法,包括使用交互触发器和命令来处理事件,以及通过接口将控件移动到ViewModel中。

0