Как создать асинхронную привязку со свойством Delay для Xamarin Forms - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть привязка к атрибуту Switch IsToggled.Я хотел бы иметь возможность указать время задержки для предотвращения двойных нажатий или двойных нажатий.Если нет способа контролировать, сколько раз в секунду PageModel получает уведомление, я хотел бы узнать, как управлять OnItemPropertyChangedEvent для запуска после Delay.

Переключатель находится внутри ViewCell

Фрагмент XAML

<Switch IsToggled="{Binding IsChecked, Delay="300"}" />

Я использую пользовательскую реализацию из ObservableCollection<T> для Привязки ViewCell .

PageModel

[AddINotifyPropertyChangedInterface]  // Using Fody
public class MainPageModel : FreshBasePageModel
{
    public MainPageModel(List<CheckTaskVieModel> dataModel)
    {
        var tasks = dataModel.Where(m => !m.IsChecked).ToList();
        var checkedTasks = dataModel.Where(m => m.IsChecked).ToList();

        Tasks = new FulyObservableCollection<CheckTaskVieModel>(tasks);
        CheckedTasks = new FulyObservableCollection<CheckTaskVieModel>(checkedTasks);

        // Set event for lists
        Tasks.ItemPropertyChanged += ItemPropertyChanged;
        CheckedTasks.ItemPropertyChanged += ItemPropertyChanged;
    }

    public FulyObservableCollection<CheckTaskVieModel> Tasks { get; set; }
    public FulyObservableCollection<CheckTaskVieModel> CheckedTasks { get; set; }

    private async void ItemPropertyChanged(object sender, ItemPropertyChangedEventArgs e)
    {
        if (e.PropertyName != "IsChecked") return;

        var items = sender as IEnumerable<CheckTaskVieModel>;
        var item = (items).ToList()[e.CollectionIndex];

        if (item == null || item?.IsAnimating == true) return;

        item.IsAnimating = true; // The event gets call twice before this value gets true

        await Task.Delay(TimeSpan.FromMilliseconds(200));

        if (item.IsChecked)
        {
            Tasks.Remove(item);
            CheckedTasks.Add(newItem);
        }
        else
        {
            CheckedTasks.Remove(item);
            Tasks.Add(newItem);
        }
    }
}

Как создать пользовательскую асинхронную привязку с атрибутом TimeSpan Delay, если это возможно?или есть другой подход, чтобы делать то, что я хочу?

...