我正在使用Prism 6开发一个简单的视频播放器应用程序。我对MVC方法更熟悉并且有关于跨视图通信的问题。以下是我的应用程序目前的设计方式:
查看:
这些视图中的每一个都有一个关联的ViewModel,目前没有任何功能。
型号:
我的第一个任务是加载视频。在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原则的方式在所有视图之间实现模型的通信?
答案 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(...)
方法返回的值)。