Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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# 等待来自子对象/视图模型的事件_C#_Mvvm_Async Await_Mvvmcross - Fatal编程技术网

C# 等待来自子对象/视图模型的事件

C# 等待来自子对象/视图模型的事件,c#,mvvm,async-await,mvvmcross,C#,Mvvm,Async Await,Mvvmcross,我正在使用MVVMCross构建WinRT/WP8应用程序,其中一个要求是用户能够上传图像。就主应用程序而言,“图片”只是一个包含一些元数据的字节数组——它的实际来源与它无关。然后我得到了(到目前为止,对于WinRT来说,还没有实现phone)一个“IPictureResource”接口,带有一个GetBytes方法和两个实现—LivePicture和FileSystem。每一个都会执行拍摄/查找图像所需的操作,并以所需格式返回图像 该应用程序目前有点笨重,因为UI层正在嗅探设备功能,并且只有在

我正在使用MVVMCross构建WinRT/WP8应用程序,其中一个要求是用户能够上传图像。就主应用程序而言,“图片”只是一个包含一些元数据的字节数组——它的实际来源与它无关。然后我得到了(到目前为止,对于WinRT来说,还没有实现phone)一个“IPictureResource”接口,带有一个GetBytes方法和两个实现—LivePicture和FileSystem。每一个都会执行拍摄/查找图像所需的操作,并以所需格式返回图像

该应用程序目前有点笨重,因为UI层正在嗅探设备功能,并且只有在摄像头不可用时才允许使用文件系统

我想做的是对这些模型进行一点抽象,可能有两个子视图模型,一个子视图模型专用于摄像头(如果可用的话,它会自动启用),另一个子视图模型用于文件系统,或者甚至可能是一个集合,如果设备有多个摄像头,为用户提供最大的选择

不管是哪种方式,我希望有一个设计,使我有多个来源的图片,都能够返回适当的数据

在过去,我会在IPicutResource上公开一个“PictureTaken”事件,并从父对象循环遍历子对象,注册每个事件并通过公共处理程序处理它们


我不明白为什么这仍然不起作用,但是我有一些喘息的空间来充分利用新技术(特别是异步/等待),现在有没有更好的方法来做到这一点,特别是我可以进行单元测试的方法?

如果你想摆脱这些事件处理程序,请点击这里。也许您的MVVM框架已经提供了一个事件聚合器。

hmm,那么很显然,观察者模式仍然是作为事件聚合器执行的。谢谢,我认为MVVMCross有一个Messenger类,但我还没有看到它的实际应用。现在看看……是的,就是这样做的。MVVM Cross中有一个符合PCL的messenger类。我似乎在同一个viewmodel上获得了多个订阅(已经重新加载了几次)。我怀疑现在某个地方需要单身汉,但我现在的方向肯定是正确的。谢谢你用像MEF这样的作曲家吗?这可能发生在您从VM的构造函数下标到聚合器时。当我想重用一个虚拟机时,我总是得到这样的结果,但每当我想重新激活它时,它就会被实例化。关于MEF,解决方案是将part creation policy属性设置为这样:
[PartCreationPolicy(CreationPolicy.Shared)]
。我没有将其设置为
CreationPolicy.NonShared
。嘿-不确定这在实际应用程序中是否会成为问题,我只是将一些代码放在一起,看看它在原则上是否有效。我有一个VM在其构造函数中订阅消息,另一个VM发布消息。我来回走了几次,因此每次都会向messagehub添加一个新的回调。消息发布时,它会发送到所有订阅者,即每次创建HomeVM时定义的回调。但这不是我在实际应用中使用它的真实方式,它将是从未知数量的子VM向父VM发送消息……我认为最重要的部分是,你需要区分这两种情况:1。如果您在两个不同的VM/视图之间来回走动,但它们的状态保持不变,这意味着您重新激活了它们。因此,您需要获取第一次访问此VM/视图时创建的实例。2.如果你真的喜欢创建新的,你也可以在每次来回走动时实例化它们。如果每次你真的想重新激活它们的时候都实例化它们,你就会创建大量的虚拟机。并导致大量事件捕获,具体取决于应用程序运行的时间。