1. 程式人生 > >WPF前臺介面顯示“未將物件引用設定到物件的例項”

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>

介面恢復正常。