Xaml 在Xamarin中使用多个自定义对象数组填充单个Listview
我是xamarin/Mobile开发的新手。我的任务是创建一个listview,它应该使用xamarin.forms填充两个不同类的对象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
`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];