为什么添加datatemplate会停止显示itemsource?

问题描述

代码将为表中的230条记录中的每条记录显示同一行的表名,而不显示字段:

ListView lv = new ListView();
        lv.ItemsSource = await App.Database.GetItemsAsync();
        StackLayout sl = new StackLayout();
        
        Label ln = new Label();
        ln.SetBinding(Label.TextProperty,nameof(ContactsModel.LastName));
        Label fn = new Label();
        fn.SetBinding(Label.TextProperty,nameof(ContactsModel.FirstName));
       
        sl.Children.Add(ln);
        sl.Children.Add(fn);
        sl.Children.Add(lv);
        Content = sl;

但是添加数据模板会导致空白屏幕

ListView lv = new ListView();
            lv.ItemsSource = await App.Database.GetItemsAsync();
            var template = new DataTemplate(typeof(ViewCell));
            lv.ItemTemplate = template;
            StackLayout sl = new StackLayout();
            
            Label ln = new Label();
            ln.SetBinding(Label.TextProperty,nameof(ContactsModel.LastName));
            Label fn = new Label();
            fn.SetBinding(Label.TextProperty,nameof(ContactsModel.FirstName));
           
            sl.Children.Add(ln);
            sl.Children.Add(fn);
            sl.Children.Add(lv);
            Content = sl;

解决方法

首先,这在XAML中更容易实现。但是如果您需要用代码完成

var template = new DataTemplate(() =>
{
    Label ln = new Label();
    ln.SetBinding(Label.TextProperty,nameof(ContactsModel.LastName));
    Label fn = new Label();
    fn.SetBinding(Label.TextProperty,nameof(ContactsModel.FirstName));
        
    var stack = new StackLayout();
    stack.Children.Add(ln);
    stack.Children.Add(fn);

    return new ViewCell { View = stack };
});

lv.ItemTemplate = template;