Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在代码隐藏文件和ViewModel之间通信_C#_Events_Mvvm - Fatal编程技术网

C# 如何在代码隐藏文件和ViewModel之间通信

C# 如何在代码隐藏文件和ViewModel之间通信,c#,events,mvvm,C#,Events,Mvvm,我试图从视图的代码隐藏文件向单独的ViewModel发送消息,以便通知ViewModel集合已更改。我理解文件使用背后的代码违反了MVVM原则,但我相信在这种情况下它是合理的 我必须使用WindowsForms控件,因此在我的应用程序中需要WindowsFormsHost。WindowsFormsHost位于代码隐藏文件中,我正在那里做所有的基础工作来设置我的WindowsForms控件(顺便说一下,这是一个视频捕获控件) 单独的视图/视图模型处理此控件捕获的视频和图像。在应用程序开始时,Vie

我试图从视图的代码隐藏文件向单独的ViewModel发送消息,以便通知ViewModel集合已更改。我理解文件使用背后的代码违反了MVVM原则,但我相信在这种情况下它是合理的

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

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

我需要与ViewModel通信,告知已捕获新的图像/视频,并且应更新视图。我已经将我的缩略图列表设置为
可观察集合
,并设置了
OnPropertyChanged
NotifyCollectionChanged
事件

如果他们被处决的话,这些应该是有效的。我注意到他们从来没有这样做过,因为没有人告诉他们这样做。我试图设置一个
事件
,该事件将在成功保存文件后引发,但由于文件保存涉及不同的类(捕获控件所需的回调类),因此我需要在ViewModel中有该类的实例来订阅该事件

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

基本上,我希望的操作顺序如下:

1。)用户打开应用程序,在一个窗格中看到视频流,在另一个窗格中看到已捕获的图像/视频缩略图(这些缩略图暂时存储在解决方案目录中的两个单独文件夹中)

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

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

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

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

在我看来,这似乎是一个事件的完美场景,但我想不出如何在不创建额外的类实例的情况下正确地连接它。如果一些代码示例有帮助,请让我知道。

您可以使用该模式。MVVM框架(如Prism和Caliburn.Micro)中包含了这方面的实现。Micro包含一个NuGet包,其中只包含事件聚合器,因此您不需要拆下整个框架

请查看此处和文档


在您的情况下,事件的发布可能发生在代码隐藏中,订阅服务器将是您响应事件的视图模型。

我一直在关注您的问题,直到您开始谈论“成功保存文件后”——我不知道这与前面的描述有何关系。你能列出你想要的操作顺序吗(最好使用列表格式)?对不起,伙计们,我甚至没有注意到格式。我道歉。下次我会记下来的@贾斯汀,是的,我会编辑然后做。什么?起初,它听起来像是您的视图有一个您的ViewModel需要了解的集合。然后你开始谈论保存一个文件。视图是否正在这样做?如果您发布一些代码,可能会更容易理解您的问题。@cadrell0对于造成的混淆,我深表歉意。对于已拍摄的图像和视频,有一个单独的视图/视图模型。控件捕获视频和/或图像并将其保存在应用程序目录中的文件夹中。保存发生在捕获控件所需的回调函数中。我无法控制这一切。保存后,需要更新视图以反映已保存的新图像/视频。感谢您的回复。这看起来很有希望。我会调查一下,看看是否能解决我的问题。