2016-11-12 9 views
1

Я разрабатываю приложение 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; } 
} 
+0

Я предполагаю, что этот код размещен в вашей странице? Можете ли вы также опубликовать свой xaml и код, как вы привязываетесь к списку? В частности, где вы назначаете свой ItemSource и ItemBindingTemplate. Не ясно, выполняете ли вы это в xaml или где-то в коде. Затем я могу попытаться воспроизвести –

+0

Код, который я изначально разместил, находится в моей пользовательской ячейке, которая используется в моем шаблоне элементов списка. Запрошенная вами информация была внесена в первоначальный вопрос. Благодарю. – Usman26

+0

Является ли MyCell от чего-то? Я вижу View = viewLayout; но в MyCell нет никакого представления. Также что _dataAccess.GetTimes(); возвращается? В ListView нет привязок. Можете ли вы поместить весь исходный код где-нибудь, чтобы я мог быстрее помочь вам? –

ответ

1
class MyCell : ViewCell 
{ 
    private readonly TimePicker _myTimePicker; 
    public MyCell() 
    { 
     _myTimePicker = new TimePicker() 
     { 
      HorizontalOptions = LayoutOptions.EndAndExpand 
     }; 

     _myTimePicker.SetBinding(TimePicker.TimeProperty, "StartTime"); 
     _myTimePicker.PropertyChanged += MyTimePicker_PropertyChanged; 
     _myTimePicker.Focused += _myTimePicker_Focused; 

     var viewLayout = new StackLayout() 
     { 
      HorizontalOptions = LayoutOptions.StartAndExpand, 
      Orientation = StackOrientation.Horizontal, 
      Padding = new Thickness(20), 
      Children = { _myTimePicker } 
     }; 
     View = viewLayout; 
    } 

    bool myTimePickerSelected; 
    private void _myTimePicker_Focused(object sender, FocusEventArgs e) 
    { 
     myTimePickerSelected = true; 
    } 

    private void MyTimePicker_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 

     if (e.PropertyName == TimePicker.TimeProperty.PropertyName && myTimePickerSelected) 
     { 
      //var dataAccess = new DataAccessLayer(); 
      //dataAccess.Update(myTimePicker.Time); 
     } 
    } 
} 
+0

Это имеет смысл. Знаете ли вы, что это можно остановить? – Usman26

+0

да. Не подписывайтесь на изменение свойств, но тогда вы не будете знать, когда время выбрано. –

+0

Мне нужно знать, когда будет выбрано время, так как вам нужно будет обновить базу данных с выбранным временем. У меня будет игра с другими вещами, чтобы посмотреть, смогу ли я обойти ее. – Usman26

 Смежные вопросы

  • Нет связанных вопросов^_^