在WPF应用中实现MVVM模式,方法
在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传递。
问题的原因是作者想要将一个事件处理程序重构到ViewModel中,但不清楚如何实现。解决方法是使用交互触发器来调用命令,在元素的MouseLeftButtonDown事件被触发时执行命令。需要引用System.Windows.Interactivity库。通过在XAML中使用
下一个问题是命令实际上是如何实现的。回答是通过在命令的Execute方法中调用SetNewPlayerPosition方法。这样可以将应用程序逻辑移动到ViewModel中。
另一个问题是如何将MediaElement Player移动到ViewModel中。回答是通过实现一个接口,然后在ViewModel中通过接口的属性来操作Player。
这篇文章介绍了在WPF应用程序中实现MVVM模式的方法,包括使用交互触发器和命令来处理事件,以及通过接口将控件移动到ViewModel中。