向MAUI页面依赖注入Model引发空引用异常,如何解决?
问题场景
将外部WinForms MVVM项目中的SlackTesterModel通过依赖注入引入MAUI页面时,触发System.ArgumentNullException,错误提示为Value cannot be null. (Parameter 'targetObject'),异常堆栈指向Microsoft.Maui.Controls.Setter.Apply。不注入该Model时页面可正常运行,异常疑似与页面内名为slackmessage的Entry控件相关。
已完成前置操作:
- 添加外部项目依赖引用,智能提示可正常识别Model
- 在MAUI项目中注册服务与
SlackTesterModel - XAML中声明对应命名空间并设置
x:DataType - 尝试两种后台代码注入写法均报错
特殊情况:SlackTesterModel位于外部项目的Controls文件夹下,MAUI自动将其识别为控件类型。
核心原因
MAUI的XAML编译器会默认将命名空间中包含Controls字样的路径下的类型识别为控件。当Model存放在Controls文件夹时,MAUI会错误地将其当作控件处理,导致在绑定或依赖注入后,Setter尝试对非控件的Model对象执行控件专属操作,最终因targetObject为空抛出异常。
解决方案
1. 调整Model存放路径(推荐)
将外部项目中的SlackTesterModel从Controls文件夹迁移至其他命名的文件夹(如ViewModels、Models),彻底避免MAUI的类型误判。迁移后同步更新MAUI项目中引用该Model的命名空间,确保XAML和后台代码的命名空间声明一致。
2. 显式区分Model与控件的命名空间(无法迁移文件夹时)
若无法移动Model的存放位置,需在MAUI的XAML中明确区分控件与Model的命名空间:
- 针对外部项目的控件,保留原命名空间声明:
xmlns:controls="clr-namespace:ExternalProject.Controls;assembly=ExternalProject" - 针对
SlackTesterModel,使用完整的命名空间路径,避免与控件命名空间混淆:
同时确保xmlns:models="clr-namespace:ExternalProject.Controls;assembly=ExternalProject"x:DataType明确指向Model类型:<ContentPage x:DataType="models:SlackTesterModel">
3. 排查XAML绑定与Setter配置
- 检查
slackmessageEntry控件的绑定表达式,确认绑定路径指向SlackTesterModel的属性,而非错误引用控件属性:<Entry x:Name="slackmessage" Text="{Binding MessageContent}" /> - 排查页面中是否存在误将Model当作控件使用的Setter配置(如Style、Trigger中错误引用Model类型),此类配置会导致MAUI尝试对Model执行控件操作。
4. 验证依赖注入注册逻辑
确认MauiProgram.cs中SlackTesterModel的注册方式正确:
builder.Services.AddScoped<SlackTesterModel>();
页面后台代码中通过构造函数注入时,确保正确绑定上下文:
public MainPage(SlackTesterModel slackTesterModel) { InitializeComponent(); BindingContext = slackTesterModel; }
内容的提问来源于stack exchange,提问作者slappy

