代碼無線循環
public partial class UserView : UserControl{public UserView(){InitializeComponent();InitData();}private void InitData(){DataContext = App.Current.Services.GetService<UserView>();}}
}
DataContext = App.Current.Services.GetService<UserView>();
由于 UserView
類本身被注冊為服務,調用 GetService<UserView>()
將嘗試創建一個新的 UserView
實例。新實例的構造函數將再次被調用,進而再次調用 InitData()
,這又會嘗試獲取一個新的 UserView
實例,從而形成一個無限循環,最終導致堆棧溢出或程序崩潰。
當您調用
App.Current.Services.GetService<UserView>()
時,如果UserView
類本身被注冊為服務(例如通過services.AddSingleton<UserView>();
或其他生命周期管理方式),那么GetService<UserView>()
將嘗試創建一個新的UserView
實例,除非該服務已經存在一個實例。然而,在默認情況下,WPF 控件如
UserControl
(包括UserView
)通常不會直接作為服務注冊到依賴注入容器中。如果您沒有明確地將UserView
注冊為服務,那么調用GetService<UserView>()
應該返回null
,而不是創建新的實例。但如果您確實以某種方式注冊了UserView
,那么就會發生您描述的情況:每次調用GetService<UserView>()
都會嘗試創建一個新的實例,導致無限循環。
解決方案
要解決這個問題,應該確保 DataContext
設置為合適的 ViewModel 而不是試圖將視圖自身設置為其數據上下文。通常的做法是使用 MVVM 模式,其中視圖 (UserView
) 綁定到一個具體的 ViewModel (UserViewModel
)。修改為
DataContext = App.Current.Services.GetService<UserViewModel>();