反应性油门没有结果

时间:2018-07-26 08:04:20

标签: system.reactive reactive

给出此设置

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; 设置订阅后立即使用,但以后可以使用吗?

1 个答案:

答案 0 :(得分:0)

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

  

仅在经过特定时间跨度时才从Observable中发射一项,而不发射另一项

source

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