簡體   English   中英

如何在代碼隱藏文件和ViewModel之間進行通信

[英]How to communicate between code-behind file and ViewModel

我試圖將消息從視圖的代碼隱藏文件發送到單獨的ViewModel,以便通知ViewModel集合已更改。 我了解使用代碼隱藏文件違反了MVVM原則,但是我認為在這種情況下這樣做是合理的。

我有一個必須使用的WindowsForms控件,因此在我的應用程序中需要一個WindowsFormsHost WindowsFormsHost位於代碼隱藏文件中,在這里,我正在做所有基礎工作來設置WindowsForms控件(順便說一下,它是一個視頻捕獲控件)。

單獨的View / ViewModel處理此控件捕獲的視頻和圖像。 在應用程序啟動時,ViewModel要求模型檢索所有圖像/視頻縮略圖,然后將它們放在視圖中的列表框中,以供用戶查看。 這是我迷路的地方。

我需要通知ViewModel已捕獲新的圖像/視頻,並且應該更新View。 我已經將縮略圖列表設置為ObservableCollection ,並設置了OnPropertyChangedNotifyCollectionChanged事件。

如果它們被執行了, 那么它們應該起作用。 我注意到他們從來沒有,因為沒有任何事情告訴他們這樣做。 我試圖設置一個event ,該event在成功保存文件后會引發,但是由於文件保存參與了另一個類(捕獲控件所需的回調類),因此我需要具有該類的實例在我的ViewModel中訂閱該事件。

這意味着我需要在ViewModel中創建另一個實例,而不是正在執行文件保存的類的實例。 有沒有一種方法可以讓我在按下UI按鈕后在代碼隱藏文件和圖像/視頻ViewModel之間進行通信?

本質上,我想要的操作順序如下:

1.)用戶打開應用程序,在一個窗格中查看視頻流,在另一個窗格中查看已捕獲的圖像/視頻縮略圖(目前,它們已存儲在解決方案目錄中的兩個單獨的文件夾中)

2.)用戶單擊“捕獲視頻”或“靜態圖像”按鈕,這將開始視頻捕獲或獲取當前視頻幀的圖像。

3.)如果單擊了視頻捕獲,則用戶必須單擊“停止”以停止視頻捕獲。 視頻將保存在視頻文件夾中。

4.)如果單擊“靜態圖像”,則會捕獲一幀並將其存儲在“圖像”文件夾中。 捕獲幀后,我正在創建該幀的BitmapImage

5.)應該通知ImageViewModel已經保存了新的圖像/視頻,並且應該更新捕獲的圖像/視頻窗格。

在我看來,這聽起來像是某個事件的理想情況,但是我無法想到如何在不創建額外類實例的情況下正確地將其連接起來。 如果某些代碼示例有幫助,請告訴我。

您可以使用事件聚合器模式。 MVVM框架(例如Prism和Caliburn.Micro)中包含此功能的實現。 Caliburn.Micro包含一個NuGet程序包,其中僅包含事件聚合器,因此您無需刪除完整的框架。

在此處查看-http://nuget.org/packages/Caliburn.Micro.EventAggregator,在此處獲取文檔。

在您的情況下,事件的發布可以在后面的代碼中進行,而訂閱者將是您對事件進行響應的視圖模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM