dynamic-data - ObservableChangeSet 等到列表准备好再观看
问题描述
我们有一个列表页面,我们可以在其中启用或禁用某事物™,使用<switch />
该事物™ 使用 IsActive 标志进行切换
public class Thing
{
/* ... */
[Reactive] public bool IsActive { get; set; }
}
给定以下更改侦听器,其想法是当IsActive
属性更改(切换开关上的用户交互)时,我们调用_saveItemCommand
以使用 new 保存实体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)
我怎样才能使它直到用户第一次切换开关时才调用命令?设置此侦听器的正确方法是什么?
解决方案
您很可能希望添加一条Where
语句来指示它只应在 IsActivated 开关上调用。
_listWatcher = DataObjectList
.ToObservableChangeSet()
.AsObservableList()
.Connect()
.WhenPropertyChanged(x => x.IsActive)
.Throttle(TimeSpan.FromMilliseconds(250))
.ToCollection()
.Where(x => x.Any(value => value.IsActive))
.ObserveOn(RxApp.MainThreadScheduler)
.Select(x => x.Sender)
.InvokeCommand(_saveItemCommand);
所以我添加的两行是
.ToCollection()
.Where(x => x.Any(value => value.IsActive))
ToCollection()
会将其转换为可观察的列表,并将Where
您的可观察限制在IsActive
值发生变化时。
FirstAsync()
如果您希望它只在通话后发生一次,您可能希望添加一个Where()
通话。