将视图模型连接到模型及其更改

时间:2017-06-14 15:46:45

标签: c# wpf mvvm prism

我正在使用Prism 6开发一个简单的视频播放器应用程序。我对MVC方法更熟悉并且有关于跨视图通信的问题。以下是我的应用程序目前的设计方式:

查看:

  • ControlView - 包含播放,暂停,快进,快退和停止的按钮。
  • VideoView - 视频帧的实际视图。
  • MenuView - 定义顶部菜单栏,其中包含两个功能:加载文件,退出程序。
  • InfoView - 显示有关视频的统计信息,例如#frames,时间长度,文件路径等

这些视图中的每一个都有一个关联的ViewModel,目前没有任何功能。

型号:

  • VideoFile - 包含有关可以播放的视频文件的元信息。

我的第一个任务是加载视频。在MenuView中,我可以使用OpenFileDialog来浏览文件。我的目标是在加载文件时以某种方式与其他视图模型进行通信,以便他们可以执行必要的操作(显示第一帧,更新视频的长度等)。

我的第一个想法是定义一个引用VideoFile

的服务
public interface IVideoService {
    VideoFile PlayingVideoFile { get; set; }
}

public class VideoService : BindableBase, IVideoService {
    private VideoFile _playingVideoFile;

    public VideoFile PlayingVideoFile {
        get => _playingVideoFile;
        set => SetProperty(ref _playingVideoFile, value);
    }
}

我只是在困惑自己。我不确定如何在视图之间实现这种通信。如何以符合Prism和MVVM原则的方式在所有视图之间实现模型的通信?

1 个答案:

答案 0 :(得分:1)

如何以符合Prism和MVVM原则的方式实现所有View [Model]之间的通信?

我假设您在询问ViewModel之间的通信(通常没有理由在您的意见之间进行通信,因此修改了您的问题)。

我知道有两种方法可以利用PRISM的ViewModel-ViewModel通信代码库:

1)EventAggregator

EventAggregator使用发布者 - 订阅者模型在ViewModel之间传递消息。虽然它可以用于与非ViewModel组件进行通信,但通常建议将其使用限制为只是 ViewModels。

2)CompositeCommand s

CompositeCommand通过提供全球可访问"注册"不同ViewModel中的命令的点。 假设CompositeCommand已初始化(通常在某些静态构造函数中),您只需使用给定的CompositeCommand注册ViewModel命令即可。这将导致每次执行CompositeCommand时都执行它。

为简洁起见,请参阅有关这两种技术的现有文档以获取更多信息。他们可以在网站上找到R. Richards在他的评论中提到(链接:http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/

由于您在通过VideoFile创建/选择新MenuView时尝试与其他ViewModel进行通信,我建议您使用以下内容:

1)创建一个名为ProcessNewVideoFileSelectionCommand的CompositeCommand(或类似的东西)。

2)注册任何需要使用ProcessNewVideoFileSelectionCommand响应新VideoFile的特定于ViewModel的命令(例如,InfoView的ViewModel将需要更改其信息以反映新的VideoFile)< / p>

3)在MenuView中选择新的VideoFile时,执行ProcessNewVideoFileSelectionCommand。这将导致所有注册的Command执行(假设它们可以执行给定每个CanExecute(...)方法返回的值)。