zoukankan      html  css  js  c++  java
  • 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>

    界面恢复正常。

  • 相关阅读:
    Solution -「ARC 101E」「AT 4352」Ribbons on Tree
    Solution -「CF 855G」Harry Vs Voldemort
    Solution -「CF 1119F」Niyaz and Small Degrees
    Solution -「AGC 029E」「AT 4504」Wandering TKHS
    Solution -「CF 840C」On the Bench
    Solution -「AGC 004E」「AT 2045」Salvage Robots
    Solution -「CF 908D」New Year&Arbitrary Arrangement
    IDEA技巧-快速遍历数组
    [LOJ6055]「from CommonAnts」一道数学题 加强版
    LeetCode437路径总和III
  • 原文地址:https://www.cnblogs.com/adingfirstlove/p/9968402.html
Copyright © 2011-2022 走看看