首页 新闻 会员 周边

在wpf中,如果不借助的prism框架的事件聚合器,如何实现viewModel间的通信呢?

0
悬赏园豆:20 [已解决问题] 解决于 2018-10-19 11:20

场景:假设有两个viewmodel,vm1,vm2。他们都有对应不同功能的command,记vm1中的command为vm1_command,vm1_command对应的方法是methond1(参数)。同理有,vm2_command,method2(参数)。现在vm2想使用vm1中的methond1。

 

借助prism的事件聚合器,我很轻松的就实现了这个功能。但是我在想如果不借助事件聚合器,那么该怎么实现呢?

我的想法有2个:

1,在vm2中写一个Event,接着在method2中event.invoke()。在vm1中new一个vm2,vm2.evet+=method1;可我在编码的过程中不知道该如何触发了。

2.在vm2中new一个vm1,接着直接调用vm1.vm_command.excute();结果是失败了

问题:请问我的两个想法哪里出了错误呢?以及如果不借助事件聚合器如何实现这样的功能呢?只要想法就行。

madeiracake的主页 madeiracake | 初学一级 | 园豆:161
提问于:2018-08-23 16:15
< >
分享
最佳答案
1

你说的第一种在VM1中出发VM2的事件,只需要在VM2中定义一个方法来触发事件即可。
第二种,单是你描述的部分是可以的,失败的原因不在于这种调用方式。
我有个思路,在一个静态类中定义静态事件,在VM1和VM2中都可以注册这个事件,再定义一个静态方法触发这个事件,这样你就可以在任何地方调用VM1和VM2的方法了

收获园豆:20
Troxx | 菜鸟二级 |园豆:229 | 2018-09-29 23:49
其他回答(2)
0

相互的话最好不要 用 委托(事件),用消息方式比较合适。至于消息模块用第三方或者自己写都可以,自己写也写不到几行。

花飘水流兮 | 园豆:13560 (专家六级) | 2018-08-23 18:04

请问这个消息方式具体是指?

支持(0) 反对(0) madeiracake | 园豆:161 (初学一级) | 2018-08-23 18:19

@madeiracake: 建议还是要了解了解系统到窗口视图的基本原理。

漫天遍地你都能看到这种东西,msmq、zmq,rabitmq...磁盘、sqlserver、系统消息,窗口消息...

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2018-08-24 00:10
1

1、楼上说的消息方式,就是你不想用的事件聚合器,说法不同而已。

2、如果不用 Message bus, Event Repository,也就是不依赖第三方,造成的恶果就是,强依赖,A和B互相依赖。

当然,如果要简单一点编程,这也不是不可以。

3、那么问题来了,不使用现成工具,或者自己创造一个轮子,或者强依赖,需要的是你对WPF MVVM结构,View 和Viewmodel之间如何交互,有一个起码的理解,而不是说,我懂得写一个 Hellow world (不理解原理,能写出多少个界面,都是hello world)。

我只能告诉你,是可以的,只是你的方法从你的描述中,感觉不太对头。

反正喜欢 MVVM编程模式的,基本很少会使用这种强依赖模式。

或者简单的说,你new 的 vm 不是和 View 绑定的那个 viewmodel,你只要能把 View 和Viewmodel 一起考虑,

事件委托其实和 Winform 没有太多的差别。

4. 以上这些其实只要买一本《WPF从入门到精通》,认真的看几遍,练习几次,思考,其实是可以学到的。

我通常学啥都会先买一本《从入门到放弃》这样的入门书的。

爱编程的大叔 | 园豆:30839 (高人七级) | 2018-08-24 09:47

谢谢解答,其实有现成工具用直接用当然是最好的,但是我觉得还是要多思考不同的可能性然后去动手做做看,从而更加去理解其中的奥秘

支持(0) 反对(0) madeiracake | 园豆:161 (初学一级) | 2018-08-24 09:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册