代码无线循环
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>();