场景:假设有两个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();结果是失败了
问题:请问我的两个想法哪里出了错误呢?以及如果不借助事件聚合器如何实现这样的功能呢?只要想法就行。
你说的第一种在VM1中出发VM2的事件,只需要在VM2中定义一个方法来触发事件即可。
第二种,单是你描述的部分是可以的,失败的原因不在于这种调用方式。
我有个思路,在一个静态类中定义静态事件,在VM1和VM2中都可以注册这个事件,再定义一个静态方法触发这个事件,这样你就可以在任何地方调用VM1和VM2的方法了
相互的话最好不要 用 委托(事件),用消息方式比较合适。至于消息模块用第三方或者自己写都可以,自己写也写不到几行。
请问这个消息方式具体是指?
@madeiracake: 建议还是要了解了解系统到窗口视图的基本原理。
漫天遍地你都能看到这种东西,msmq、zmq,rabitmq...磁盘、sqlserver、系统消息,窗口消息...
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从入门到精通》,认真的看几遍,练习几次,思考,其实是可以学到的。
我通常学啥都会先买一本《从入门到放弃》这样的入门书的。
谢谢解答,其实有现成工具用直接用当然是最好的,但是我觉得还是要多思考不同的可能性然后去动手做做看,从而更加去理解其中的奥秘