【问题标题】:Reactive Extensions Throttle produce no results反应式扩展节流阀不产生任何结果
【发布时间】:2018-07-26 08:04:20
【问题描述】:

鉴于此设置,

public static class NotifyPropertyChangedExtensions
{
    public static IObservable<EventPattern<PropertyChangedEventArgs>> WhenPropertyChanged(this INotifyPropertyChanged source)
    {
        return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
            ev => source.PropertyChanged += ev,
            ev => source.PropertyChanged -= ev);
    }
}

public class Node : INotifyPropertyChanged
{
    public bool IsChecked
    {
        get => _isChecked;
        set
        {
            if (_isChecked != value)
            {
                _isChecked = value;
                OnPropertyChanged();
            }
        }
    }
}

nodes.Values.Select(node => node.WhenPropertyChanged())
            .Merge()
            .Where(x => x.EventArgs.PropertyName == "IsChecked")
            .Throttle(TimeSpan.FromMilliseconds(200))
            .Subscribe(x =>
            {
                // do somethings
            });

为什么当我打电话时这不会触发任何事件? nodeX.IsChecked = true; 设置订阅后立即生效,但之后可以使用?

【问题讨论】:

  • 如果您可以扩展发布的代码以便实际编译并可以使用,那就太好了。

标签: system.reactive reactive


【解决方案1】:

您确实意识到这是 Throttle 运算符的预期行为:

仅在经过特定时间跨度后才从 Observable 发射一个项目而它没有发射另一个项目

(source)

因此,在您的情况下,由于您在应用 Throttle 运算符之前执行了 Merge,因此在更改为 IsChecked 后会发出一个项目然后在 200 毫秒后发出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多