【发布时间】:2020-02-21 01:26:30
【问题描述】:
我们有一个列表页面,我们可以在其中使用 <switch /> 启用或禁用 thing™,该 thing™ 使用 IsActive 标志进行切换
public class Thing
{
/* ... */
[Reactive] public bool IsActive { get; set; }
}
鉴于以下更改侦听器,其想法是当IsActive 属性更改(用户在拨动开关上进行交互)时,我们调用_saveItemCommand 以使用新的IsActiveState 保存实体。
public ObservableCollection<Thing> DataObjectList {get;} = new ObservableCollection<Thing>();
public MyClass()
{
_saveItemCommand = ReactiveCommand.CreateFromTask(SaveItemInternal);
_listWatcher = DataObjectList
.ToObservableChangeSet()
.AsObservableList()
.Connect()
.WhenPropertyChanged(x => x.IsActive)
.Throttle(TimeSpan.FromMilliseconds(250))
.ObserveOn(RxApp.MainThreadScheduler)
.Select(x => x.Sender)
.InvokeCommand(_saveItemCommand);
}
public void OnNavigatingTo()
{
var newItems = _myService.GetNewItems();
DataObjectList.AddRange(newItems);
}
public void OnDestroy()
{
_listWatcher?.Dispose();
}
我遇到的问题是,当我设置列表时,似乎在调用AddRange 之后立即对列表中的最后一项调用了该命令。
我尝试过使用
.Skip(1),但没有任何运气,但一件事似乎有效但很难看是.Skip(DataObjectList.Length)
如何才能使命令在用户第一次切换开关时才被调用?设置此侦听器的正确方法是什么?
【问题讨论】: