Я разрабатываю приложение Xamarin для Android с использованием форм Xamarin для создания моего макета. Я столкнулся с проблемой, когда мой сборщик времени выстрелил в загрузку моей камеры просмотра.Xamarin TimePicker propertychanged событие, запущенное при загрузке
Что я делаю, это создание представления списка, а затем установка шаблона элемента в мой пользовательский шаблон ячейки представления. В моем шаблоне ячейки я создаю TimePicker и привязываю к нему событие PropertyChanged. Я также устанавливаю свойство TimePicker.Time с информацией, полученной из базы данных. На данный момент похоже, что мое событие PropertyChanged запускается для каждого элемента, который будет отображаться в виде списка. Это приводит к нескольким вызовам базы данных, которые не нужны.
Есть ли способ остановить событие PropertyChanged, вызываемое до тех пор, пока свойство фактически не будет изменено?
Мой код ниже.
public class MyCell : ViewCell
{
private readonly TimePicker _myTimePicker;
public MyCell()
{
_myTimePicker = new TimePicker()
{
HorizontalOptions = LayoutOptions.EndAndExpand
};
_myTimePicker.SetBinding(TimePicker.TimeProperty, "StartTime");
_myTimePicker.PropertyChanged += MyTimePicker_PropertyChanged;
var viewLayout = new StackLayout()
{
HorizontalOptions = LayoutOptions.StartAndExpand,
Orientation = StackOrientation.Horizontal,
Padding = new Thickness(20),
Children = { _myTimePicker }
};
View = viewLayout;
}
private void MyTimePicker_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == TimePicker.TimeProperty.PropertyName && _myTimePicker.Time != TimeSpan.MinValue)
{
var dataAccess = new DataAccessLayer();
dataAccess.Update(myTimePicker.Time);
}
}
}
Я не знаю, почему PropertyChanged событие вызывается несколько раз, и как его остановить стрельбу, пока я на самом деле выбрать время. Любая помощь будет оценена по достоинству.
Ниже представлен мой код для формы для отображения списка. Все мои xaml определены в коде. «MyCell» использует значения, возвращаемые из «_dataAccess.GetTimes()».
public class TimeDetails : ContentPage
{
private ListView _listView;
private readonly DataAccessLayer _dataAccess = new DataAccessLayer();
protected override void OnAppearing()
{
_listView = new ListView
{
RowHeight = 80,
SeparatorColor = Color.Blue,
SeparatorVisibility = SeparatorVisibility.Default
};
_listView.ItemsSource = _dataAccess.GetTimes();
_listView.ItemTemplate = new DataTemplate(typeof(MyCell));
_listView.ItemSelected += ListView_ItemSelected;
Content = new StackLayout
{
VerticalOptions = LayoutOptions.FillAndExpand,
Children = { _listView }
};
}
}
Тип возвращаемого значения _dataAcess.GetTimes() - это список задач. Модель TaskTime показана ниже.
public class TaskTime
{
public int Id { get; set; }
public string Task { get; set; }
public TimeSpan StartTime { get; set; }
}
Я предполагаю, что этот код размещен в вашей странице? Можете ли вы также опубликовать свой xaml и код, как вы привязываетесь к списку? В частности, где вы назначаете свой ItemSource и ItemBindingTemplate. Не ясно, выполняете ли вы это в xaml или где-то в коде. Затем я могу попытаться воспроизвести –
Код, который я изначально разместил, находится в моей пользовательской ячейке, которая используется в моем шаблоне элементов списка. Запрошенная вами информация была внесена в первоначальный вопрос. Благодарю. – Usman26
Является ли MyCell от чего-то? Я вижу View = viewLayout; но в MyCell нет никакого представления. Также что _dataAccess.GetTimes(); возвращается? В ListView нет привязок. Можете ли вы поместить весь исходный код где-нибудь, чтобы я мог быстрее помочь вам? –