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

能否在XAML中为Xamarin.Forms的IEnumerable类型ViewModel填充数据?

可以在XAML中填充IEnumerable类型的ViewModel,但需要调整写法

当然可以在XAML中直接填充你的ListViewItem(IEnumerable类型),不过你当前的XAML写法有个小问题——你把ListViewRow直接作为CollapsibleGridView的子元素了,而不是把它们添加到作为BindingContext的ListViewItem集合里。下面是调整后的实现方式:

第一步:确保ViewModel支持集合初始化

首先,建议把ListViewItem改成继承自ObservableCollection<ListViewRow>(而非单纯实现IEnumerable),这样既满足XAML集合初始化的要求,还能让UI自动响应集合的增删改操作:

public class ListViewItem : ObservableCollection<ListViewRow>
{
    // 保留无参数构造函数,XAML解析器需要它来实例化对象
    public ListViewItem() { }
}

public class ListViewRow
{
    public string Caption { get; set; }
    public string Text { get; set; }
    public bool Hidden { get; set; }
    public int Height { get; set; }
}

第二步:调整XAML的集合填充方式

在XAML中,你需要把ListViewRow元素嵌套到ListViewItem的标签内部,让XAML解析器自动把这些行数据添加到集合中,而不是直接作为控件的可视化子元素:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="WrhseCtrls.Views.CollapsibleGridPage"
             xmlns:local="clr-namespace:WrhseCtrls;assembly=WrhseCtrls">
    <ContentPage.Content>
        <local:Views.CollapsibleGridView Title="XAML Populated ViewModel">
            <local:Views.CollapsibleGridView.BindingContext>
                <local:ViewModels.ListViewItem>
                    <!-- 这些ListViewRow会自动被添加到ListViewItem集合中 -->
                    <local:ViewModels.ListViewRow Caption="Row 1" Text="First Text" Hidden="False" Height="30"/>
                    <local:ViewModels.ListViewRow Caption="Row 2" Text="Second Text" Hidden="False" Height="30"/>
                </local:ViewModels.ListViewItem>
            </local:Views.CollapsibleGridView.BindingContext>
        </local:Views.CollapsibleGridView>
    </ContentPage.Content>
</ContentPage>

关键注意点

  • 原写法的问题:你之前把ListViewRow直接放在CollapsibleGridView标签下,这相当于把它当成了控件的可视化子元素,但你的控件是绑定到IEnumerable类型的ViewModel,所以需要把行数据放到ViewModel的集合里,而非控件的子元素树中。
  • 如果ListViewItem无法继承ObservableCollection(比如已继承其他类),可以给它定义一个ObservableCollection<ListViewRow>类型的属性(例如Rows),然后在XAML中用<local:ViewModels.ListViewItem.Rows>标签来嵌套ListViewRow元素。
  • 确保ListViewRow类有公共无参数构造函数,或者所有属性都支持通过XAML属性赋值初始化(就像你当前的写法一样)。

调整完成后,你的CollapsibleGridView就能通过BindingContext获取到XAML中填充的ListViewItem集合数据了。

内容的提问来源于stack exchange,提问作者David Christopher Reynolds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:00