如何在代码隐藏文件和ViewModel之间进行通信

时间:2012-02-29 15:07:32

标签: c# events mvvm

我正在尝试将视图的代码隐藏文件中的消息发送到单独的ViewModel,以便通知ViewModel集合已更改。我理解代码隐藏文件的使用打破了MVVM原则,但我相信在这种情况下它是合理的。

我必须使用WindowsForms控件,因此在我的应用程序中需要WindowsFormsHostWindowsFormsHost位于代码隐藏文件中,我正在做所有基础工作来设置我的WindowsForms控件(顺便提一下,这是一个视频捕获控件)。

单独的View / ViewModel处理此控件捕获的视频和图像。在应用程序开始时,ViewModel要求Model检索所有图像/视频缩略图,然后将它们放在视图中的ListBox中供用户查看。这是我迷失的地方。

我需要与ViewModel通信已捕获新的图像/视频并且应该更新View。我已将我的缩略图列表设置为ObservableCollection,并设置了OnPropertyChangedNotifyCollectionChanged个事件。

那些应该有用,如果它们正在被执行。我注意到他们从来没有,因为没有什么能告诉他们这样做。我试图设置一个event,它会在文件成功保存后引发,但由于文件保存参与了另一个类(捕获控件所需的回调类),我需要一个我的ViewModel中该类的实例,用于订阅该事件。

这意味着我需要在我的ViewModel中创建另一个实例,该实例不是正在执行文件保存的类的实例。是否有一种方法可以让我在按下UI按钮后在代码隐藏文件和图像/视频ViewModel之间进行通信?

基本上,我所希望的操作顺序是这样的:

1)。用户打开应用程序,并且在一个窗格中看到视频流和已捕获的图像/在另一个视频的缩略图(这些被存储在溶液目录内的两个单独的文件夹现在)

2。)用户点击“捕获视频”或“静止图像”按钮,该按钮将开始视频捕获或拍摄当前视频帧的图像。

3。)如果点击了视频捕获,用户必须点击“停止”才能停止视频捕获。视频将保存在视频文件夹中。

4。)如果单击“静止图像”,则会捕获一个帧并将其存储在“images”文件夹中。我在捕获帧后创建了一个BitmapImage

5。)应通知ImageViewModel已保存新的图像/视频,并应更新捕获的图像/视频窗格。

这听起来像是一个事件的完美情况,但我想不出如何在不创建额外的类实例的情况下正确连接它。如果一些代码示例有帮助,请告诉我。

1 个答案:

答案 0 :(得分:0)

你可以event aggregator模式。 MVVM框架中包含了这种实现,例如Prism和Caliburn.Micro。 Caliburn.Micro包含一个NuGet包,它只包含事件聚合器,因此您无需下载完整的框架。

请查看此处 - http://nuget.org/packages/Caliburn.Micro.EventAggregatorhere以获取文档。

在您的情况下,事件的发布可能发生在后面的代码中,订阅者将是您的视图模型,它响应事件。