WPF前台界面显示“未将对象引用设置到对象的实例”
程序员文章站
2022-05-23 21:19:48
一个偶尔出现令人不爽的WPF界面显示问题:“未将对象引用设置到对象的实例”。 ......
在做即时通信项目中,使用wpf的mvvm模式,如果在前台绑定vm,经常会显示波浪线,鼠标放上去提示未将对象引用设置到对象的实例,但程序能正常运行,后来发现如果前台不绑定vm,在后台cs里绑定就不会出现此问题。虽然不是大问题,但对于强迫症患者还是很难受的。
<usercontrol.datacontext> <vm:alarmgrouplistvm/> </usercontrol.datacontext>
没有必要非得改,因为显示波浪线这个有时候出现有时候不出现,而且改了,对于纯粹的mvvm模式忠实者会嗤之以鼻。
另外,因为某个页面初次加载时需要显示全部的用户数据,耗时较长,为了客户友好性,在初始加载的方法中使用了异步线程加载,界面会先显示出来,然后就出现了一个比较难受的问题,程序能正常运行,但是前台界面的设计中显示报错了,提示未将对象引用设置到对象的实例,并详细的指出了问题就出在初始加载的方法中,看不到界面非常难受,必须解决这个问题,上网查找相关问题,定位到问题出现的原因。
分析原因:
vs会自动的预编译程序,会按照程序在启动时的需要解释xaml,按照xaml中的顺序生成控件,先布局的先生成。在初始加载方法中启动异步线程,异步线程中使用前台控件绑定的属性,与主ui线程分属不同线程,vs判定不了先后顺序,会认为你使用的属性尚未实例,前台中会显示错误,正常启动程序时则不会出现问题。
解决办法:
在vm中的初始加载方法中添加限制,判断当界面初始化完毕后在执行,可以使用if (this.isloaded)判断,也可以直接改变初始加载的事件为loaded。
1 <i:interaction.triggers> 2 <i:eventtrigger eventname="loaded"> 3 <i:invokecommandaction command="{binding loaddatacommand}"></i:invokecommandaction> 4 </i:eventtrigger> 5 <i:eventtrigger eventname="closed"> 6 <i:invokecommandaction command="{binding cancelcommand}" commandparameter="{binding elementname=groupcreate}"></i:invokecommandaction> 7 </i:eventtrigger> 8 </i:interaction.triggers>
界面恢复正常。
上一篇: .Net Core与跨平台时区
下一篇: HTML之body标签中的相关标签补充