You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# MAUI嵌套对象List属性显示问题:绑定Plop属性报错求助

问题分析与解决

你遇到的报错核心是绑定路径的上下文搞混了:当CollectionView的ItemsSource绑定到TestModel.Toto后,每个列表项的上下文是单个Toto对象,而不是TestViewModel。如果绑定语法错误,就会导致UI去ViewModel里找Plop属性,自然找不到。

下面是具体的排查和修正步骤:

1. 修正ViewModel与模型的可绑定性

首先确保所有需要绑定的属性都能通知UI更新,否则即使数据正确,UI也可能不显示或报错:

  • ViewModel要继承ObservableObject(来自CommunityToolkit.Mvvm,MAUI推荐用这个简化MVVM):
using CommunityToolkit.Mvvm.ComponentModel;

namespace testbinding.ViewModel
{
    public partial class TestViewModel : ObservableObject
    {
        [ObservableProperty]
        private TestModel _testModel;

        public TestViewModel()
        {
            // 模拟API返回数据
            TestModel = new TestModel
            {
                Toto = new ObservableCollection<Toto>
                {
                    new Toto { Plop = "第一条数据" },
                    new Toto { Plop = "第二条数据" }
                }
            };
        }
    }
}
  • 把TestModel的List<Toto>改成ObservableCollection<Toto>(List不会触发UI更新通知),同时模型类也建议继承ObservableObject:
using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;

public partial class TestModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<Toto> _toto;
}

public partial class Toto : ObservableObject
{
    [ObservableProperty]
    private string _plop;
}

2. 修正XAML绑定语法

确保CollectionView的ItemsSource正确指向TestModel.Toto,同时ItemTemplate内的绑定直接针对Toto对象的Plop属性:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:testbinding.ViewModel"
             x:Class="testbinding.MainPage">
    <!-- 先设置页面的BindingContext为ViewModel -->
    <ContentPage.BindingContext>
        <vm:TestViewModel />
    </ContentPage.BindingContext>

    <CollectionView ItemsSource="{Binding TestModel.Toto}">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <!-- 此时上下文是单个Toto对象,直接绑定Plop即可 -->
                <Label Text="{Binding Plop}" Margin="10" />
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</ContentPage>

常见错误排查

  • 不要在ItemTemplate里写{Binding TestModel.Toto.Plop}:这会强制去ViewModel里找这个路径,而单个Toto对象没有这个层级的属性。
  • 检查是否误给ItemTemplate内的控件设置了Source或RelativeSource指向ViewModel:如果强制指定了数据源为ViewModel,就会跳过当前Toto对象的上下文。

内容的提问来源于stack exchange,提问作者BarryF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:10:05