使用 DataTemplate 时,ListView 仅显示列表中的最后一项
Posted
技术标签:
【中文标题】使用 DataTemplate 时,ListView 仅显示列表中的最后一项【英文标题】:ListView show only the last item in a list when using DataTemplate 【发布时间】:2019-12-02 02:04:37 【问题描述】:我将客户列表绑定到 Xamarin Listview。我想使用带有 ViewCell 的 DataTemplate。
根据文档,我们可以使用 2 个构造函数之一:
new DataTemplate(typeof(CustomerViewCell));
new DataTemplate(=>new CustomerViewCell);
但是,它们会导致不同的结果。第一个正确显示列表,而第二个显示重复列表的最后一项。
我不知道一些基本的东西吗?
这是我的客户模型:
public class Customers : List<Customer>
public Customers()
Add(new Customer No = 1, Name = "Microsoft" );
Add(new Customer No = 2, Name = "Google" );
Add(new Customer No = 3, Name = "Facebook" );
public class Customer
public int No get; set;
public string Name get; set;
这里是继承自 ViewCell 的 CustomerViewCell.xaml
<?xml version="1.0" encoding="UTF-8"?>
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="LVDataTemplate.View.CustomerViewCell">
<ViewCell.View>
<StackLayout Orientation="Horizontal">
<Label Text="Binding No" />
<Label Text="Binding Name" />
</StackLayout>
</ViewCell.View>
</ViewCell>
CustomerListView,显示客户:
public partial class CustomerListView :ContentPage
public CustomerListView()
InitializeComponent();
MyListView.ItemsSource = new Customers();
//1. Work correctly
// MyListView.ItemTemplate = new DataTemplate(typeof(CustomerViewCell));
//2. Work in-correctly. only the last item repeated through out the list
var theCell = new CustomerViewCell();
MyListView.ItemTemplate = new DataTemplate(()=>theCell);
第一个代码显示结果:
-
微软。
谷歌
脸书
第二场演出
-
脸书
脸书
脸书
【问题讨论】:
您正在阅读哪些显示第二种格式的特定文档? docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/… 【参考方案1】:请在此处阅读文档:data-templates/creating
方法public DataTemplate(Func<object> loadTemplate);
是用来创建一个datatemplate作为resource,所以第二个构造函数的正确用法是:
var personDataTemplate = new DataTemplate(() =>
return new ViewCell1();
);
Resources = new ResourceDictionary();
Resources.Add("personTemplate", personDataTemplate);
testListView.ItemTemplate = (DataTemplate)Resources["personTemplate"];
或者您可以像这样自定义 ViewCell:
var personDataTemplate = new DataTemplate (() =>
var grid = new Grid ();
...
return new ViewCell View = grid ;
);
另外,您可以直接使用 personDataTemplate 而不将其定义为资源:
testListView.ItemTemplate = personDataTemplate;
您的代码的问题是您应该在块内创建theCell,您可以使用:
var personDataTemplate = new DataTemplate(() =>
return new ViewCell1();
);
或者
public partial class MainPage : ContentPage
public MainPage()
InitializeComponent();
testListView.ItemTemplate = new DataTemplate(() => test());
public ViewCell1 test()
//other actions
return new ViewCell1();
第一个构造函数MyListView.ItemTemplate = new DataTemplate(typeof(CustomerViewCell));
是creating-a-datatemplate-with-a-type,没错。
【讨论】:
谢谢你,杰克华。正如您所说,问题是在构造函数块之外创建单元视图。以上是关于使用 DataTemplate 时,ListView 仅显示列表中的最后一项的主要内容,如果未能解决你的问题,请参考以下文章
使用 Trigger 更改 DataTemplate 时随机选择的项目
在 DataTemplate 中使用时,行为 DependencyProperty 不更新 ViewModel
对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?
如何使用类似表格的 DataTemplate 在 UWP ListView 中动态缩放列宽