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

Xamarin CommunityToolKit:ListView中Expander内CollectionView绑定失败求助

Xamarin ListView+Expander+CollectionView 绑定问题解决

以下是针对你遇到的CollectionView无数据问题的排查和解决步骤:

  • 修正绑定路径的层级关系
    ListView绑定的是ViewModel的STemplateData(ObservableCollection<STemplateItem>),每个ListViewItem对应的是单个STemplateItem实例。Expander内容里的CollectionView需要绑定当前STemplateItem内部的ICodeData集合,而非ViewModel全局的ICodeData集合。
    错误绑定(指向ViewModel全局集合):

    <CollectionView ItemsSource="{Binding Source={RelativeSource AncestorType={x:Type YourViewModel}}, Path=ICodeData}" />
    

    正确绑定(自动继承当前Item的DataContext):

    <CollectionView ItemsSource="{Binding ICodeData}" />
    

    注意:如果你的STemplateItem类中集合属性名不是ICodeData,请替换为实际属性名称。

  • 确保Model类的属性定义正确
    STemplateItem类必须包含ObservableCollection类型的集合属性,且实现INotifyPropertyChanged接口,同时在构造函数中初始化集合避免null:

    public class STemplateItem : INotifyPropertyChanged
    {
        private ObservableCollection<ICodes> _iCodeData;
        public ObservableCollection<ICodes> ICodeData
        {
            get => _iCodeData;
            set
            {
                _iCodeData = value;
                OnPropertyChanged();
            }
        }
    
        public STemplateItem()
        {
            // 初始化集合,防止绑定到null
            ICodeData = new ObservableCollection<ICodes>();
        }
    
        // 实现INotifyPropertyChanged接口
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    这里要注意:ViewModel无需单独定义ICodeData集合,每个STemplateItem应持有自己对应的子数据集合。

  • 验证数据赋值逻辑
    在ViewModel初始化STemplateData时,要给每个STemplateItem的ICodeData集合添加具体数据:

    public ObservableCollection<STemplateItem> STemplateData { get; set; }
    
    public YourViewModel()
    {
        STemplateData = new ObservableCollection<STemplateItem>();
        
        // 示例:给第一个模板项添加子数据
        var templateItem = new STemplateItem();
        templateItem.ICodeData.Add(new ICodes { /* 填充ICodes的属性值 */ });
        templateItem.ICodeData.Add(new ICodes { /* 填充ICodes的属性值 */ });
        STemplateData.Add(templateItem);
    }
    
  • 避免手动覆盖DataContext
    检查XAML中Expander是否手动设置了DataContext,这会破坏ListViewItem的DataContext继承,导致CollectionView无法获取当前STemplateItem的数据。禁止类似以下写法:

    <Expander DataContext="{Binding Source={RelativeSource AncestorType={x:Type YourViewModel}}}">
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:20:31