使用 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&lt;object&gt; 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 中动态缩放列宽

发生事件时在 DataTemplate 中运行 Storyboard

如何设置控件属性(在DataTemplate和UserControl中)的绑定以使用ItemSource的给定属性?