У меня есть привязка к атрибуту 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
, если это возможно?или есть другой подход, чтобы делать то, что я хочу?