鉴于下面的更改侦听器,其想法是当IsActive
属性更改时(用户在拨动开关上进行交互),我们调用_saveItemCommand
以将实体保存为新的IsActiveState
。
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 ObservableCollection<Item> DataObjectList {get;} = new ObservableCollection<Item>();
public void OnDestroy()
{
_listWatcher?.Dispose();
}
我遇到的问题是,当我设置列表时,似乎在调用AddRange
之后立即在列表的最后一项上调用了该命令。
我如何做到这一点,以便在用户第一次切换开关之前不调用该命令?设置此侦听器的正确方法是什么?
[您很可能希望添加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()
调用。