Xaml 在Xamarin中使用多个自定义对象数组填充单个Listview

Xaml 在Xamarin中使用多个自定义对象数组填充单个Listview,xaml,xamarin,xamarin.forms,Xaml,Xamarin,Xamarin.forms,我是xamarin/Mobile开发的新手。我的任务是创建一个listview,它应该使用xamarin.forms填充两个不同类的对象 `Class A { string PendingRequestID; string PendingRequestStatus; string PendingRequest; } Class B { String CompletedRequestId; String ApprovedByUsername; DateTime CompletedTi

我是xamarin/Mobile开发的新手。我的任务是创建一个listview,它应该使用xamarin.forms填充两个不同类的对象

`Class A
{
 string PendingRequestID;
 string PendingRequestStatus;
 string PendingRequest;
}

Class B
{
 String CompletedRequestId;
 String ApprovedByUsername;
 DateTime CompletedTime
}
` 上面是两个不同的实体,我需要在单个列表视图中填充这两个实体的对象列表。每个对象都有自己独立的UI布局

如何在xamarin.forms中的ListView中指定多个ItemSource


请帮助我。

您不能为
ItemSource
分配多个类型。因此,一种方法是使用第三个类作为基类,然后从中派生
a
B
。然后将此
C
类型用作
ItemSource

Class C{
   ...
}

Class A : C
{
   string PendingRequestID;
   string PendingRequestStatus;
   string PendingRequest;
}

Class B : C
{
   String CompletedRequestId;
   String ApprovedByUsername;
   DateTime CompletedTime
}
请注意,当您单击列表中的
项时,您需要在运行时检查正确的子类型


希望有帮助

您不能为
ItemSource
分配多个类型。因此,一种方法是使用第三个类作为基类,然后从中派生
a
B
。然后将此
C
类型用作
ItemSource

Class C{
   ...
}

Class A : C
{
   string PendingRequestID;
   string PendingRequestStatus;
   string PendingRequest;
}

Class B : C
{
   String CompletedRequestId;
   String ApprovedByUsername;
   DateTime CompletedTime
}
请注意,当您单击列表中的
项时,您需要在运行时检查正确的子类型


希望有帮助

只需在
ListView
上为
ItemsSource
创建一个类型为
ObservableCollection
的属性,并使用数据模板选择器,为
ListView
提供基于项目类型的模板即可

可以找到一个例子

编辑-1:示例代码

class MyDataTemplateSelector : Xamarin.Forms.DataTemplateSelector
{
    public MyDataTemplateSelector()
    {
        // Retain instances!
        this._typeADataTemplate = new DataTemplate(typeof(TypeAViewCell));
        this._typeBDataTemplate = new DataTemplate(typeof(TypeBViewCell));
    }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        if (item == null)
            return null;
        return (item is A) ? this._typeADataTemplate : this._typeBDataTemplate;
    }

    private readonly DataTemplate _typeADataTemplate;
    private readonly DataTemplate _typeBDataTemplate;
}

只需在
ListView
上为
ItemsSource
创建一个类型为
ObservableCollection
的属性,并使用数据模板选择器为
ListView
提供基于项目类型的模板

可以找到一个例子

编辑-1:示例代码

class MyDataTemplateSelector : Xamarin.Forms.DataTemplateSelector
{
    public MyDataTemplateSelector()
    {
        // Retain instances!
        this._typeADataTemplate = new DataTemplate(typeof(TypeAViewCell));
        this._typeBDataTemplate = new DataTemplate(typeof(TypeBViewCell));
    }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        if (item == null)
            return null;
        return (item is A) ? this._typeADataTemplate : this._typeBDataTemplate;
    }

    private readonly DataTemplate _typeADataTemplate;
    private readonly DataTemplate _typeBDataTemplate;
}

要添加的是,当您定义将listview绑定到的ObservaleCollection时,它将是ObservaleCollection,其中C是您的两个子类型继承自的类。@Tait感谢您的宝贵建议,但在我的场景中,我需要根据类型使用不同类型的UI布局。@Thavudu好的,很抱歉我错过了这些信息。那么DataTemplateSelector就是一种方法。快乐编码!要添加的是,当您定义将listview绑定到的ObservaleCollection时,它将是ObservaleCollection,其中C是您的两个子类型继承自的类。@Tait感谢您的宝贵建议,但在我的场景中,我需要根据类型使用不同类型的UI布局。@Thavudu好的,很抱歉我错过了这些信息。那么DataTemplateSelector就是一种方法。快乐编码!这是最好的方法,数据模板非常适合这种情况。@Sharada Gururaj。谢谢你的解决方案。我现在就试试这个解决方案。@sharada Gururaj。工作正常:)。如何为驻留在customview单元格中的控件添加事件处理程序?我是否需要将其添加到customviewcell的cs页面或我的Maincontentpage cs文件中?如果我必须将其添加到Maincontentpage的cs文件中;如何在Customviewcell的xamal中指定它?使用事件来命令行为会更容易;或点击识别器命令;尤其是在使用模板时controls@Sharada古鲁拉,谢谢你。现在,我已将GestureRecognitor添加到标签中,并添加了一个命令参数。但我无法在viewcell的代码隐藏中获取命令参数。var itemssender=(Xamarin.Forms.View)sender;var itemTapGestureRecognizer=(TapGestureRecognizer)itemSender.GestureRecognizers[0];这是最好的方法,数据模板非常适合这种情况。@Sharada Gururaj。谢谢你的解决方案。我现在就试试这个解决方案。@sharada Gururaj。工作正常:)。如何为驻留在customview单元格中的控件添加事件处理程序?我是否需要将其添加到customviewcell的cs页面或我的Maincontentpage cs文件中?如果我必须将其添加到Maincontentpage的cs文件中;如何在Customviewcell的xamal中指定它?使用事件来命令行为会更容易;或点击识别器命令;尤其是在使用模板时controls@Sharada古鲁拉,谢谢你。现在,我已将GestureRecognitor添加到标签中,并添加了一个命令参数。但我无法在viewcell的代码隐藏中获取命令参数。var itemssender=(Xamarin.Forms.View)sender;var itemTapGestureRecognizer=(TapGestureRecognizer)itemSender.GestureRecognizers[0];