能否在XAML中为Xamarin.Forms的IEnumerable类型ViewModel填充数据?
可以在XAML中填充IEnumerable类型的ViewModel,但需要调整写法
当然可以在XAML中直接填充你的ListViewItem(IEnumerableListViewRow直接作为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
相关产品推荐
相关产品推荐

