Xamarin CommunityToolKit: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

