欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF前台界面显示“未将对象引用设置到对象的实例”

程序员文章站 2023-01-11 19:08:18
一个偶尔出现令人不爽的WPF界面显示问题:“未将对象引用设置到对象的实例”。 ......

在做即时通信项目中,使用wpf的mvvm模式,如果在前台绑定vm,经常会显示波浪线,鼠标放上去提示未将对象引用设置到对象的实例,但程序能正常运行,后来发现如果前台不绑定vm,在后台cs里绑定就不会出现此问题。虽然不是大问题,但对于强迫症患者还是很难受的。

<usercontrol.datacontext>
        <vm:alarmgrouplistvm/>
</usercontrol.datacontext>

没有必要非得改,因为显示波浪线这个有时候出现有时候不出现,而且改了,对于纯粹的mvvm模式忠实者会嗤之以鼻。

WPF前台界面显示“未将对象引用设置到对象的实例”

 

另外,因为某个页面初次加载时需要显示全部的用户数据,耗时较长,为了客户友好性,在初始加载的方法中使用了异步线程加载,界面会先显示出来,然后就出现了一个比较难受的问题,程序能正常运行,但是前台界面的设计中显示报错了,提示未将对象引用设置到对象的实例,并详细的指出了问题就出在初始加载的方法中,看不到界面非常难受,必须解决这个问题,上网查找相关问题,定位到问题出现的原因。

WPF前台界面显示“未将对象引用设置到对象的实例”

分析原因:
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>

界面恢复正常。