1.我第一个接触的MVVM框架是Caliburn Micro,后来接触到了ReactiveUI这种响应式编程思想的框架,主要说一下本人目前学习感想(针对尽快上手使用MVVM开发WPF);
首当其冲的工具是DeepSeek,总结好问题直接提问,可以快速地给到我们参考案例,自己再根据给的案例逻辑进行复制使用,逐步优化,可以实现基本的功能需求;
但是仅仅参考DeepSeek去开发的话,后期一些细节上的问题暴露出来感觉会很难去排查,这个时候就得去搜索其他资源,简单的就是一些博客文章,技术科普、视频讲解之类的,但是我发现网上关于ReactiveUI的分享博客很少(比着Prism等其他框架而言),这个时候在去百度搜索相关字眼,慢慢筛选质量比较好的文章一般就是翻译来的了,但是与我想要查找的知识点对准度不是很高,但是也能学到一些思路;
其实,官网一直是最好的学习工具。
举个例子来说:
我想在这个框架中实现绑定前端按钮的鼠标左键按下事件,然后我去询问DP,他也很给力的给出了以下代码:
this.WhenActivated(a => {
//绑定鼠标按下事件
Observable
.FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(
h => btn_PositiveRelative.PreviewMouseDown += h,
h => btn_PositiveRelative.PreviewMouseDown -= h)
.Select(ep => new MouseCommandArgs
{
Sender = ep.Sender,
EventArgs = ep.EventArgs
})
.InvokeCommand(ViewModel, vm => vm.MouseDownCommand)
.DisposeWith(a);
});
(其中的MouseCommandArgs类是他让我定义在ViewModel中用来承接参数的,其中的Select函数作用就是生成方法参数传递到后台)
当时不知到DP是怎么学到这些代码的,就去官网搜了一下相关字眼:
然后慢慢找,在使用手册的事件一栏中找到了对应代码案例:
但是我想找的是如何绑定控件的鼠标按下或者抬起的事件如何做绑定,不是Command默认的Click事件,就接着往下看;
结合自身对WPF的理解,看到这里画圈的第三点和给出的XAML代码中的EventName="Tapped"字眼,隐约感觉到就在附近了。
注意看给出的CS代码中的注释:// Use any of reactive extensions operators here!
翻译过来是://在这里使用任何响应式扩展操作符!
先不管,继续往下看:
靠,这不就是DP给的写法吗,翻译一下,发现这些就是Rx.Net的内容了,继续点击进去看一下;
根据上下文和对应的注释慢慢去理解,Select是用来提取参数,在回到代码进到定义:
实际上Select函数是 IObservable<TSource>的扩展方法,类似于Linq中的select,可以便捷使我们的对List中(在这里是数据流)的每一项进行操作,生成新的列表;所以,Rx.官网中的下面代码就是生成一个事件参数流,当有事件产生时,就会提取出对应的参数,就会反馈到这个事件流,让他流动,如果这个事件流后面被订阅了,就可以触发到对应的订阅方法上。
然后再结合ReactiveUI官网中给出的:
根据Select的位置就可以拼接成DP 给的代码案例了。
总结一下就是利用Rx.Net创造事件(参数)流,这个流再使用ReactiveUI的InvokeCommand激发到ViewModel中定义的命令上。
至此,先告一段落,我写这些的意义是想表述官网的重要性。
也声明一下,我是个菜鸟,如有异议,欢迎沟通,一起探讨。