2017-06-14 93 views
0

我正在開發使用Prism 6的簡單視頻播放器應用程序。我對MVC方法更熟悉,並且有關於跨視圖通信的問題。這裏是我的應用程序如何設計,目前:將視圖模型連接到模型及其更改

瀏覽:

  • ControlView - 包含按鈕播放,暫停,快進,快退,停止。
  • VideoView - 視頻幀的實際視圖。
  • MenuView - 定義帶有兩個功能的頂層菜單欄:加載文件,退出程序。
  • 的InfoView - 顯示關於視頻統計信息,例如幀#,長度在時間,文件路徑等

每個視圖具有不帶功能的現在相關聯的視圖模型。

型號:

  • 錄像檔案 - 包含有關視頻文件可隨時播放元信息。

我的第一個任務是加載視頻。在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原則的方式在所有視圖之間實現模型的交流?

+2

一些交流選項在[這裏]解釋(http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/)。我傾向於傾向於[事件聚合](http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/#event-aggregation)。 –

+1

所有的視圖模型(除了主視圖模型)都應該是其他視圖模型的子模型。他們可以公開事件,以便他們的父視圖模型可以通過事件安排兄弟姐妹之間的交流。除此之外,其他任何事情都需要花費更多的時間和精力來編寫更難以編寫,理解和維護的代碼。視角模型之間的交流絕非輕而易舉。任何使其變得困難的設計都是根本錯誤的。 –

+0

@EdPlunkett感謝您的評論。你能指點我一些能告訴我Prism如何設置子視圖模型的資源嗎?我不知道如何將它們連接在一起。 – Alex

回答

1

如何以符合Prism和MVVM原則的方式實現所有View [Model]之間的通信?

我假設你問你ViewModels之間的溝通(通常沒有理由在你的Views之間進行溝通,因此修改你的問題)。

有兩種方法,我知道,利用PRISM的代碼庫視圖模型 - 視圖模型通信:

1)EventAggregator

EventAggregator使用了的ViewModels之間傳遞消息的發佈者 - 訂閱模式。雖然它可以用於與非ViewModel組件進行通信,但通常建議將其用途限制爲只需 ViewModels。

2)CompositeCommand小號

CompositeCommand S按在不同的ViewModels命令提供全局可訪問的 「登記」 的點工作。假設CompositeCommand已被初始化(通常在一些靜態構造函數中),您可以簡單地將您的ViewModel命令註冊到給定的CompositeCommand。這將導致每次執行CompositeCommand時都會執行它。

爲了簡潔起見,請參閱現有的有關這兩種技術的文檔以獲取更多信息。他們可以在網站R.理查茲在他的評論中提到(鏈接:http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/)找到

既然你想在創建/通過MenuView選擇新VideoFile與其他的ViewModels溝通,我會推薦以下內容:

1)創建一個名爲ProcessNewVideoFileSelectionCommand的CompositeCommand(或其他)。

2)寄存器需要一個新的VideoFile與ProcessNewVideoFileSelectionCommand響應任何視圖模型特有的命令(例如InfoView中的視圖模型將需要改變其信息以反映新的VideoFile

3)當新的VideoFile選擇在MenuView中,執行ProcessNewVideoFileSelectionCommand。這將導致所有Command向其註冊執行(假設它們可以在給定各自的CanExecute(...)方法返回的值的情況下執行)。