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

MAUI中MVVM模式下ListView绑定ObservableCollection数据上下文异常

问题原因与解决方案

你的问题出在强类型绑定的上下文继承上:ContentPage已经设置了x:DataType="vm:UserList_ViewModel",这会让内部的DataTemplate默认继承这个类型上下文,导致列表项的绑定仍然指向ViewModel,而非单个User对象。

解决步骤:

  1. 添加User类的命名空间引用
    在ContentPage的xmlns声明中,添加User所在的命名空间(假设你的User类在WaiterEval.Models下,根据实际项目路径调整):
xmlns:models="clr-namespace:WaiterEval.Models"
  1. 给DataTemplate指定x:DataType
    在DataTemplate标签上添加x:DataType="models:User",明确列表项的绑定上下文为User对象:
<ListView.ItemTemplate>
    <DataTemplate x:DataType="models:User">
        <ViewCell>
            <Grid Padding="10">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.5*" />
                    <ColumnDefinition Width="0.25*" />
                    <ColumnDefinition Width="0.25*" />
                </Grid.ColumnDefinitions>
                <!-- 绑定User的具体属性,替换{Binding }为实际属性名,比如Name -->
                <Label Grid.Row="0" Grid.Column="0" Text="{Binding Name}" />
                <Label Grid.Row="0" Grid.Column="1" Text="{Binding Test}" />
                <Label Grid.Row="0" Grid.Column="2" Text="Edited" />
            </Grid>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>
  1. 验证User类的属性访问权限
    确保User类的Test等需要绑定的属性是公共可访问的,示例:
public class User
{
    public string Name { get; set; }
    public string Test { get; set; }
    // 其他业务属性...
}

补充说明:

MAUI的强类型绑定(通过x:DataType)会启用编译时绑定检查,同时改变绑定上下文的继承规则。当父容器设置了x:DataType,子容器如果需要不同的上下文,必须显式指定自己的x:DataType,否则绑定会默认沿用父级的类型,导致无法找到子项对象的属性。

内容的提问来源于stack exchange,提问作者Sören Precht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:02:58