MVVM数据传递
- 项目需求
在MVVM的架构下的项目中遇到一个功能需求,在补货申请单中,新增采购订单表,从主表中查询已有数据,新增时通过按钮触发命令的形式打开新增仓柜窗口,当在新增窗口填写完基本信息时,需要将商品添加置订单表中
- 回顾
记得我发过一期,跨页面数据传递的博文,通过使用全局变量的方式进行传递,通过全局变量的方式从别的页面取数据虽然可行,但全局变量还是会用比较多的各种各样的问题及限制,虽然可以解决但过程曲折且麻烦的很,后来发现一种更直接的方法,这种方法虽然在操作上比较像跨页面传值,但事实上却是在当前viewmode中直接操作新打开的操作窗口
- 思路
在MVVM架构下,通常我们在view model中打开一个新的窗口,可以使用open,showdialog等方式,使用open窗口打开后,不回回调,而使用showdialog则会再一次回调,则在打开该窗口关闭后,会回调一次,这种使用场景适合用于,打开某一窗口,在该窗口操作完成后(而此时主窗口不能被操作,唯有在新打开窗口操作完成后主窗口才能被操作),回到原窗口的操作,例如:像商品选择,商品新增,商品修改等操作,通过使用showdialog的形式,可以很方便的进行新增完商品后在原页面查看新增的结果,与修改编辑后的结果,或是需要获取新打开窗口进行操作的某一结果或其中方法及属性值等操作,通过在showdialog方法后编辑的代码,这一类操作在行为上更像是“拿”,从新的viewmodel中直接将某些以定义好的属性拿回来,而不是在新窗口中传回来的操作,
一般来说,向什么地方进行传值等操作,需要new一个新的窗口,并为其绑定viewmodel,而new的窗则是一个新实例,其指向的是新的,通过new一个新的窗口进行传数据的方式,往往会出现,感觉像是传过去了,而然当要取的时候往往没有值,后来在别人指导下,才知道new的是一个新的对象的实例,而不是原来的对象以至于传值的时候,传递的值传向viewmodel中,但取值的时候往往没能取出来
操作过程如下
主窗口–新增仓柜表格—》仓柜选择窗口—》主窗口
主窗口viewmodel—》仓柜选择ViewModel—》主窗口ViewModel
代码
过程如下:通过双击给按钮命令,将所需的窗口showDialog();出来,新窗口完成Load加载有关数据并呈现出来。
通过绑定:数据源等操作,将加载时查询到的结果呈现到页面上,通过selectedItem绑定临时的数据表。
代码如下
给表格绑定,双击选择命令,当双击时对临时选中的数据进行判断,如存在那就关闭当前窗口。其showdialog();后执行获取其中被绑定临时表中的数据对当前表进行赋值等操作。此时完成从另一窗口到本窗口的数据传递
效果图
新增一行空白行,并双击该行打开,仓柜选择窗口
双击某一仓柜明细信息数据行,接收到的数据并存储在当前datagrid表中。
总结
以上就是,本文仅仅简单介绍了使用showdialog的方法,实现对数据的传递。通过使用showdialog的形式,可以很方便的进行新增完商品后在原页面查看新增的结果,与修改编辑后的结果,或是需要获取新打开窗口进行操作的某一结果或其中方法及属性值等操作,这一类操作在行为上更像是“拿”,从新的viewmodel中直接将某些以定义好的属性拿回来,而不是在新窗口中传回来的操作,这种方式更像需要什么取什么,传值更像是需要什么给什么,最后效果都一致。