C# (Xamarin)将多个类中的数据绑定到一个ListView?

C# (Xamarin)将多个类中的数据绑定到一个ListView?,c#,sqlite,xamarin,xamarin.forms,C#,Sqlite,Xamarin,Xamarin.forms,我试图构建一个从两个SQLite表中提取数据的ListView。一个是标题表,另一个是明细表。Header表有一个充当主键的Id字段,它与Detail表有一对多关系(该Id字段是两个表共享的唯一列) 理论上,我的ListView将在ViewCell中显示标题表的Id,点击时将展开并显示具有相同Id的所有细节表行。问题是,我不知道如何设置ListView的ItemsSource以从两个表中绘制,显然SQLite不接受List作为有效属性。至于展开/折叠操作,我认为在点击的事件处理程序中设置View

我试图构建一个从两个SQLite表中提取数据的ListView。一个是标题表,另一个是明细表。Header表有一个充当主键的Id字段,它与Detail表有一对多关系(该Id字段是两个表共享的唯一列)

理论上,我的ListView将在ViewCell中显示标题表的Id,点击时将展开并显示具有相同Id的所有细节表行。问题是,我不知道如何设置ListView的ItemsSource以从两个表中绘制,显然SQLite不接受
List
作为有效属性。至于展开/折叠操作,我认为在点击的事件处理程序中设置ViewCell的HeightRequest是我将尝试的方法,但请不要犹豫,分享您以前可能用于此操作的任何技术或代码片段

编辑:@iSpain17这是我的代码,根据iSpain17答案的最后一段。XAML编辑器给我的错误是“属性'ElementTemplateContent'设置了多次。”


您没有提供自己的代码,因此我只能猜测:

您创建了一个类,例如HeaderDetails(显然只是一个草稿):

类标题详细信息:BindableObject{
公共列表详细信息用于ISID{get;set;}
公共int Id{get;set;}
公共标题详细信息(内部标题ID){
Id=头Id;
detailsforthiId=GetDetailItemsForId(headerId);//此方法基于给定Id查询SQLite详细信息表。
}
}
然后页面的主视图模型有一个
列表

公共类视图模型:INotifyPropertyChanged{
[...]
私有ObservableCollection标头详细列表{get;set;}
公共可观测采集头详细信息{
get=>headerDetailsList;
设置{
headerDetailsList=值;
OnPropertyChanged();
}
}
[...]
公共视图模型(){
[...]
var_headerDetailList=新列表();
var headerIds=queryalheaderids()//应返回SQLite头表中所有头ID的列表。
foreach(headerId中的var headerId){
_添加(新的HeaderDetails(headerId));
}
HeaderDeltaillist=新的可观测集合(_HeaderDeltaillist);
}
}
然后在XAML文件中(请使用CollectionView)


[...]
[...]
[...]
[...]

您可以使用该插件。通过使用LinkedIn或XING登录,您可以获得我们完整产品的免费许可证。我不知道你能从Syncfusion的社区版中得到什么,但是他们的Listview有一个用于页眉、页脚和LoadMore的模板,它几乎解决了普通Listview的所有问题(就像你描述的那样),请看这里的示例:,如果社区版允许你使用他们的Listview,我会同意。额外提示:这可能就是您想要的:我现在正在试验Syncfusion的ListView控件,它似乎适合我的需要,但是文档中并不是非常清楚分组是如何工作的,更不用说我如何根据特定的数据场景进行分组了。有什么建议吗?@Nick你很幸运,我又一次在这篇文章中绊倒了,因为你没有提到任何对此发表评论的人,我评论的最后一个链接就是你需要的,如果你按照分组()上的所有文档进行操作,您会注意到,您可以通过声明标题分隔符,但还有其他方法,只需花一个小时阅读有关Syncfusion ListView分组部分的所有信息谢谢您的帮助:但是在XAML端CollectionView不允许我这样将一个嵌套在另一个中?仍然不允许以该格式使用ItemTemplate和DataTemplate进行嵌套。您可以添加代码吗?如果看不到您的实际代码,就很难提供帮助。您不能将多个元素作为DataTemplate。将其包装在StackLayout中(正如您在我的上一行中看到的:
),这意味着DataTemplate必须是单个视图。
<CollectionView ItemsSource="{Binding HeaderDetailsList}">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <TextCell Text="{Binding HeaderId}"/>
                            <CollectionView>
                                <CollectionView.ItemTemplate>
                                    <DataTemplate>
                                        <TextCell Text="{Binding DetailsPart1}"/>
                                    </DataTemplate>
                                </CollectionView.ItemTemplate>
                            </CollectionView>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
class HeaderDetails : BindableObject {

    public List<Detail> DetailsForThisId { get; set; }
    public int Id { get; set; }

    public HeaderDetails(int headerId) {
       Id = headerId;
       DetailsForThisId = GetDetailItemsForId(headerId); //This method queries your SQLite details table based on given Id.
    }

}
public class ViewModel : INotifyPropertyChanged {
    [...]
    private ObservableCollection headerDetailsList { get; set; }
    public ObservableCollection<HeaderDetails> HeaderDetailList {
        get => headerDetailsList;
        set {
            headerDetailsList = value;
            OnPropertyChanged();
        }
    }
    [...]

    public ViewModel() {
        [...]
        var _headerDetailList = new List<HeaderDetails>();
        var headerIds = QueryAllHeaderIds() //Should return a list of all header Ids in your SQLite header table.

        foreach(var headerId in headerIds) {
             _headerDetailsList.Add(new HeaderDetails(headerId));
        }

        HeaderDetailList = new ObservableCollection(_headerDetailList);
    }
}
<CollectionView ItemSource="{Binding HeaderDetailsList}" [...]>
  [...]
  <CollectionView.ItemTemplate>
    <DataTemplate>
      <!-- Your inner View (StackLayout, etc.) --> 
      [...]
      <CollectionView ItemSource="{Binding DetailsForThisId}" [...]>
        [...]
      </CollectionView>
      [...]
    </DataTemplate>
  </CollectionView.ItemTemplate>
</CollectionView>