Могу ли я напрямую использовать TemplatedItems ListView в Xamarin.Формы для обновления свойств?

#c# #xaml #xamarin #xamarin.forms #xamarin.forms.listview

#c# #xaml #xamarin #xamarin.forms #xamarin.forms.listview

Вопрос:

По какой-то особой причине я не могу использовать Xamarin.Для привязки данных формы я должен напрямую обновлять свойства представления, созданные ItemTemplate в ListView.

MainPage.xaml

 <?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="TestListView.MainPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    <Grid>
        <ListView x:Name="TestListView" />
        <Button
            Clicked="Button_Clicked"
            HorizontalOptions="Center"
            Text="Change last appearing text"
            VerticalOptions="Center" />
    </Grid>
</ContentPage>
  

MainPage.xaml.cs

 using System.Linq;
using Xamarin.Forms;

namespace TestListView {
    public partial class MainPage : ContentPage {
        private int lastApprearingItemIndex = -1;
        public MainPage() {
            InitializeComponent();
            TestListView.ItemTemplate = new DataTemplate(() => {
                return (new ViewCell() {
                    View = new Label()
                });
            });
            TestListView.ItemsSource = Enumerable.Range(1, 10000).ToArray();
            TestListView.ItemAppearing  = TestListView_ItemAppearing;
        }
        private void TestListView_ItemAppearing(object sender, ItemVisibilityEventArgs e) {
            lastApprearingItemIndex = e.ItemIndex;
            ((Label)(((ViewCell)(TestListView.TemplatedItems[e.ItemIndex])).View)).Text = "test text for id "   (int)(e.Item);
        }
        private void Button_Clicked(object sender, System.EventArgs e) {
            ((Label)(((ViewCell)(TestListView.TemplatedItems[lastApprearingItemIndex])).View)).Text = "(changed)test text for id "   lastApprearingItemIndex;
        }
    }
}
  

Этот тест хорошо работает в Android
введите описание изображения здесь

введите описание изображения здесь

Но в UWP он ничего не показывает

введите описание изображения здесь

Он также хорошо работает в WPF.

Итак, у меня есть два вопроса:

1. Почему это не работает в UWP?

2, Будет ли ListView повторно использовать представление элемента, подобного ListAdapter, в Android?

Комментарии:

1. Насколько я знаю, вам придется использовать ObservableCollection, чтобы он мог уведомлять пользовательский интерфейс. Я думаю, проблема здесь не в том, что он не обновляется, а просто не обновляет пользовательский интерфейс. Посмотрите на значения ItemsSource после внесения изменений.

2. Вы не можете напрямую изменять пользовательский интерфейс, для этого вам нужно использовать привязки

Ответ №1:

1. Почему это не работает в UWP?

Потому что вы использовали ViewCell для своего listview, и вы не привязываете к нему никакого значения.

Если вы настаиваете на том, чтобы не использовать привязку к данным, вы можете изменить фоновый код следующим образом. формат.

  public partial class MainPage : ContentPage
    {
       
        ObservableCollection<string> employees;
        public MainPage()
        {
            InitializeComponent();
           
            employees = new ObservableCollection<string>();
            for (int i = 0; i < 100; i  )
            {
                employees.Add("test text for id "   i);
            }


            TestListView.ItemsSource = employees;
       
        }
        protected override void OnAppearing()
        {
           
            base.OnAppearing();
           
        }
      
        private void Button_Clicked(object sender, System.EventArgs e)
        {
            //set the id that you want to change
            employees[1] = "test111";
         
        }
    }
  

Здесь запущен gif.
введите описание изображения здесь

2, Будет ли ListView повторно использовать представление элемента, подобного ListAdapter, в Android?

В формах xamarin их нет ListAdapter , поэтому я настоятельно рекомендую вам использовать привязку к данным, код будет более элегантным и простым. Вот полезная статья об этом.

https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/data-and-databinding