#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";
}
}
2, Будет ли ListView повторно использовать представление элемента, подобного ListAdapter, в Android?
В формах xamarin их нет ListAdapter
, поэтому я настоятельно рекомендую вам использовать привязку к данным, код будет более элегантным и простым. Вот полезная статья об этом.
https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/data-and-databinding