.NET MAUI绑定CollectionView时无法识别ObservableCollection嵌套属性
问题原因
该错误是几个常见的.NET MAUI XAML绑定低级错误叠加导致的,核心原因如下:
- 控件属性名写错:
CollectionView用来绑定集合数据源的属性是*ItemsSource*,你写的Source是所有VisualElement都有的基础属性,根本不会触发集合项生成逻辑,此时DataTemplate内的绑定上下文根本不是你预期的MyModel实例,自然找不到对应属性。 - XAML语法错误:你所有的
{Binding}标记扩展都没有用双引号包裹属性值,XAML解析器无法正确识别绑定表达式,会直接导致绑定失效。 - 类型定义可能存在缺陷:如果上述两个问题修正后还是报错,说明你的
Vehicle类没有公开带公共get访问器的Make属性——MAUI绑定引擎只能识别公共实例属性,私有字段、内部属性、只写属性都会触发“属性未找到”错误。 - 额外注意:你贴的
MyModel定义漏了class关键字,属于编译级错误,应该是粘贴代码时的笔误。
修复步骤
按顺序修正即可解决问题:
- 修正C#类定义
补全MyModel的类声明,同时确保Vehicle类正确公开Make属性:// MyModel补全class关键字 public class MyModel { public string Name { get; set; } public Vehicle Car { get; set; } = new Vehicle(); } // Vehicle类必须公开带公共get的Make属性 public class Vehicle { public string Make { get; set; } } - 修正XAML绑定写法
把错误的Source改为ItemsSource,所有绑定表达式用双引号包裹:<CollectionView ItemsSource="{Binding Data}"> <CollectionView.ItemTemplate> <DataTemplate> <StackLayout> <Label Text="{Binding Car.Make}" /> </StackLayout> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> - 检查页面绑定上下文
确保页面的BindingContext被正确赋值为MyViewModel的实例,例如在页面构造函数中添加:public YourPage() { InitializeComponent(); BindingContext = new MyViewModel(); } - (可选)支持运行时值更新
如果后续需要运行时修改Car实例或者Make属性的值并同步更新UI,给MyModel和Vehicle类实现INotifyPropertyChanged接口即可,你的BaseViewModel已经实现了该接口,直接继承复用逻辑就行。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

