ObservableChangeSet等待列表就绪,然后观看

问题描述 投票:0回答:1

鉴于下面的更改侦听器,其想法是当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之后立即在列表的最后一项上调用了该命令。

我如何做到这一点,以便在用户第一次切换开关之前不调用该命令?设置此侦听器的正确方法是什么?

dynamic-data reactiveui
1个回答
0
投票

[您很可能希望添加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()调用。

© www.soinside.com 2019 - 2024. All rights reserved.