測試發現,父控件構造函數中初始化界面的部分會完成子控件與父控件ViewModel
的數據綁定。因此,如果在父控件構造函數執行前初始化父控件ViewModel
中的屬性,將導致在子控件執行OnApplyTemplate
時無法獲取到綁定的改屬性。因此,需要盡量避免在父控件構造前構造父控件的ViewModel
。
正常情況下,ViewModel
的初始化都會在控件構造后。我遇到這個問題是由於使用DataTemplate+ViewModel
進行控件切換,需要提前初始化ViewModel
作為DateTemplate
選擇View
的依據。
我發現TextBox
這類原生框架並不會因為這種順序的差異而出現問題,本質上還是自己寫的自定義控件存在缺陷。日后我會繼續尋找這個缺陷,現在出現的這個問題,我會通過在父控件InitializeComponent()
方法前再次初始化ViewModel
中屬性的方式解決。