मैं एक ग्राहक सूची को Xamarin सूचीदृश्य में बाध्य कर रहा हूं। मैं इसमें एक व्यूसेल के साथ डेटा टेम्पलेट का उपयोग करना चाहता हूं।

प्रलेखन के अनुसार, हम 2 कंस्ट्रक्टरों में से एक का उपयोग कर सकते हैं:

  1. नया डेटा टेम्पलेट (टाइपऑफ़ (ग्राहक दृश्य सेल));

  2. नया डेटा टेम्पलेट (=>नया ग्राहक दृश्य सेल);

हालांकि, वे अलग-अलग परिणाम देते हैं। पहला वाला सूची को सही ढंग से प्रदर्शित करता है, जबकि दूसरा सूची के अंतिम आइटम को दोहराता है।

क्या मैं यहाँ कुछ बुनियादी नहीं जानता?

यहाँ मेरा ग्राहक मॉडल है:

 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; }

    }

और यहाँ CustomerViewCell.xaml है, जो ViewCell से विरासत में मिला है

<?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);

        }


    }

पहला कोड परिणाम दिखाता है:

  1. माइक्रोसॉफ्ट।
  2. गूगल
  3. फेसबुक

दूसरा शो

  1. फेसबुक
  2. फेसबुक
  3. फेसबुक
0
Eric Ngo 24 जुलाई 2019, 04:32

1 उत्तर

सबसे बढ़िया उत्तर

कृपया दस्तावेज़ यहाँ पढ़ें: डेटा-टेम्प्लेट/बनाना

विधि public DataTemplate(Func<object> loadTemplate); का उपयोग डेटा टेम्पलेट को संसाधन के रूप में बनाने के लिए किया जाता है, इसलिए दूसरे कंस्ट्रक्टर का सही उपयोग है:

var personDataTemplate = new DataTemplate(() => {

        return new ViewCell1();
    });


    Resources = new ResourceDictionary();
    Resources.Add("personTemplate", personDataTemplate);

    testListView.ItemTemplate = (DataTemplate)Resources["personTemplate"];

या आप व्यूसेल को इस तरह से कस्टमाइज़ कर सकते हैं:

var personDataTemplate = new DataTemplate (() => {
  var grid = new Grid ();
  ...
  return new ViewCell { View = grid };
});

साथ ही, आप personDataTemplate को सीधे संसाधन के रूप में परिभाषित किए बिना उपयोग कर सकते हैं:

 testListView.ItemTemplate = personDataTemplate;

आपके कोड की समस्या यह है कि आपको ब्लॉक के अंदर सेल बनाना चाहिए, आप इसका उपयोग कर सकते हैं:

    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)); है क्रिएटिंग-ए-डेटाटेम्प्लेट-साथ-ए-टाइप, यह सही है।

0
Jack Hua 24 जुलाई 2019, 06:14