首页 > 解决方案 > 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)

我怎样才能使它直到用户第一次切换开关时才调用命令?设置此侦听器的正确方法是什么?

标签: dynamic-datareactiveui

解决方案


您很可能希望添加一条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()通话。


推荐阅读